JSONSTREAM est une bibliothèque offrant une API de streaming de bas niveau pour la lecture et la rédaction du balisage JSON. Aucune sérialisation ou désérialisation automatique n'a lieu et aucun objet n'est créé en mémoire. En conséquence, il y a très peu de frais généraux et vous pouvez même gérer le balisage JSON trop grand pour s'adapter à la mémoire. L'analyseur est également tolérant aux pannes et peut signaler et se remettre de certaines erreurs comme la nidification incorrecte ou une virgule manquante. Il est facile à utiliser et à s'adapter à vos propres cas d'utilisation.
D'autres bibliothèques JSON font beaucoup de choses à la fois. Lors de l'analyse de JSON, ils analysent non seulement, mais transforment également le balisage en arborescence d'objets, ou même utilisent la réflexion / RTTI pour cartographier automatiquement entre vos propres objets et leur représentation JSON. L'analyseur de JSONSTREAM, d'autre part, n'est qu'un analyseur. Ce que vous faites avec les données dépend entièrement de vous. Cela signifie également que vos classes / structures / enregistrements ne doivent pas être une représentation 1: 1 du JSON, ce qui peut être très utile lorsque vous travaillez avec des API JSON existantes.
Alors que d'autres bibliothèques JSON vous obligent à définir la structure JSON de manière déclarative, dans JSONSTREAM, la structure est définie comme du code, ce qui le rend beaucoup plus flexible et expressif. Par exemple, s'il existe une valeur qui peut être null ou un entier, vous pouvez simplement le tester, plutôt que de déclarer un type Nullable<int> spécial avec un tas de méthodes surchargées. À mesure que votre spécification JSON devient plus complexe, l'approche déclarative adoptée par d'autres bibliothèques devient difficile à lire et à maintenir, et se traduit par beaucoup de code passerelle. Vous finissez par écrire du code Turing-complete en utilisant la syntaxe du modèle, ce qui n'est pas ce que vous voulez. JSONSTREAM, d'autre part, vous permet simplement d'utiliser le langage Turing-Complete déjà à votre disposition.
En lisant:
var
s: string;
i: integer;
...
begin
Stream := TStringStream.Create( ' ["Hello", "World", 42] ' );
Reader := TJsonReader.Create(Stream);
if Reader.List then
while Reader.Advance <> jsListEnd do
begin
if Reader.Str(s) then
WriteLn(s)
else if Reader.Number(i) then
WriteLn(i)
end ;
end ;En écrivant:
begin
Stream := TIOStream.Create(iosOutput);
Writer := TJsonWriter.Create(Stream,[],true);
Writer.Dict;
Writer.Key( ' Hello ' );
Writer.Str( ' World ' );
Writer.Key( ' Flag ' );
Writer.Bool(true);
Writer.Key( ' Numbers ' );
Writer.List;
Writer.Number( 1 );
Writer.Number( 2 );
Writer.Number( 3 );
Writer.ListEnd;
Writer.DictEnd;
end ;=>
{
"Hello" : " World " ,
"Flag" : true ,
"Numbers" : [
1 ,
2 ,
3
]
}Trouvez plus d'exemples ici.
Cette bibliothèque peut lire et écrire les normes suivantes:
Il adhère étroitement aux normes et peut être utilisé pour valider ou désinfecter le balisage JSON. Il peut même continuer à analyser après une erreur, si vous le souhaitez. Voir un exemple pour une telle utilisation dans Pascal / Exemple / JSONECHO.
La bibliothèque peut traiter des entrées arbitraires avec des caractéristiques d'exécution prévisibles. Les chaînes et les touches d'objet peuvent être traitées chunk par chunk en utilisant les méthodes StrBuf et KeyBuf , et n'ont donc pas à résider en mémoire dans leur intégralité. La sémantique de ces fonctions est similaire au système read sur les systèmes POSIX.
Le temps nécessaire pour analyser un fichier JSON est délimité par O (n + e * k), où n est la longueur en octets, E est le nombre d'erreurs corrigées et k est la profondeur de nidification maximale. Pour la plupart des cas d'utilisation, l'avortant sur la première erreur est bien (c'est aussi la valeur par défaut), auquel cas le temps d'exécution devient O (n). L'utilisation de la mémoire est délimitée par O (K). Vous pouvez spécifier une profondeur de nidification maximale admissible lors de l'initialisation. L'analyseur abandonnera alors une fois cette limite atteinte.
La sortie peut être assez imprimée si vous le souhaitez ou utiliser une représentation compacte sans espace blanc supplémentaire.
Ce référentiel a des sous-dossiers pour les différentes implémentations de langue de la bibliothèque. Actuellement, la seule implémentation est écrite dans Pascal, mais d'autres implémentations (par exemple C) sont prévues.
Sous-dossiers:
| Dossier | Description |
|---|---|
| pascal | Mise en œuvre de la Pascal de JSONSTREAM |
Ce projet est autorisé sous la licence du MIT.
Copyright 2021 Philip Zander
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.