JSONDOC a commencé comme BSONDOC.PAS et IBSONDocument dans le projet Tmongowire. Puisqu'il s'agissait d'un analyseur JSON solide, basé sur Iunknowns (pour le comptage de référence) et les variantes (je déteste vraiment, vraiment les longues listes de surcharges pour Allkinds of Types). Le besoin a surgi pour manipuler JSON dans plusieurs projets sans rapport avec MongoDB, donc l'idée a fait surface pour avoir un projet dédié autour IJSONDocument .
(Pour terminer le mouvement, Tmongowire a depuis remplacé bsonDoc.pas par jsonDoc.pas et des fonctions de conversion séparées pour convertir et à BSON.)
Pour créer une nouvelle instance IJSONDocument :
function JSON: IJSONDocument; overload;
Pour créer et remplir une nouvelle instance IJSONDocument :
function JSON(const x: array of Variant): IJSONDocument; overload;
Passez une liste de touches et valeurs alternativement, suffix la clé avec { pour démarrer un document intégré et utiliser la clé } pour la fermer. Par exemple: avec
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString reviendra {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Convertissez une variante en une référence IJSondocument.
function JSON(x: Variant): IJSONDocument; overload;
Selon la valeur de l'argument:
IJSONDocument ,nil ,IJSONDocument . Fusionnez une chaîne avec des données JSON dans l'instance IJSONDocument , les clés existantes obtiendront leurs valeurs écrasées (voir Clear ci-dessous).
function Parse(const JSONData: WideString): IJSONDocument;
Convertissez les données dans l'instance IJSONDocument en une chaîne JSON.
function ToString: WideString;
Convertir les données dans l'instance IJSONDocument en un tableau de dimensions variant [0 .. n , 0..1], où [ i , 0] maintient les clés et [ i , 1] contient des valeurs.
function ToVarArray: Variant;
Effacez les valeurs de l' IJSONDocument , mais gardez la liste des clés.
procedure Clear;
Lors du traitement d'une séquence de documents JSON avec un ensemble similaire de clés (et des clés des documents intégrés), les performances peuvent être acquises en évitant la dé- et réallocation de la mémoire pour stocker les clés (et l'enregistrement variant pour leurs valeurs). (Voir aussi IJSONDocArray ci-dessous).
Récupérez une valeur par clé. Il s'agit de la propriété par défaut, vous pouvez donc accéder aux clés d'un IJSONDocument par index notation (par exemple: d['id'] ).
property Item[const Key: WideString]: Variant; default;
ATTENTION: Par défaut, l'implémentation IJSONDocument : TJSONDocument n'est pas une file d'attente. Veuillez utiliser les méthodes de verrouillage et de synchronisation appropriées pour vous assurer qu'un seul thread accède à une instance à la fois, ou déclarer conditionnel définir JSONDOC_THREADSAFE .
Créez une instance IJSONEnumerator pour une référence IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Vérifiez que l'énumérateur est passé la fin de l'ensemble des clés du document.
function EOF: boolean;
Déplacez l'itérateur vers l'élément suivant dans l'ensemble. Déplace l'itérateur vers le premier élément du premier appel. Retourne Faux lorsqu'il est passé au-delà de la fin de l'ensemble.
function Next: boolean;
Renvoie la clé ou la valeur de l'élément actuel dans l'ensemble.
function Key: WideString;
function Value: Variant;
Renvoie la clé ou la valeur de l'élément actuel dans l'ensemble.
Utilisez une instance IJSONDocArray pour stocker un ensemble de documents JSON similaires. JSON est converti vers et depuis des chaînes en interne pour enregistrer sur l'utilisation de la mémoire. Utilisez LoadItem avec une seule instance IJSONDocument pour réutiliser les clés et enregistrer sur l'allocation de mémoire. Préchargez un parent IJSONDocument avec une instance IJSONDocArray pour reporter une partie de l'analyse des documents pour enfants.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Ajoutez un document au tableau.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Récupérez un document à l'aide d'une instance IJSONDocument existante, réutilisant éventuellement les clés allouées.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Récupérez le nombre de documents dans le tableau.
function Count: integer; stdcall;
Convertissez les données dans l'instance IJSONDocArray en une chaîne JSON.
function ToString: WideString; stdcall;
Récupérez un document par index, dans une nouvelle instance IJSONDocument . Il s'agit de la propriété par défaut, vous pouvez donc utiliser la notation d'index (par exemple: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Si vous avez besoin de traiter des documents contenant de nombreux et / ou de grandes tableaux, certaines performances peuvent se perdre car la manipulation des tableaux de variantes effectue une copie profonde sur l'affectation par défaut.
Pour éviter cela, définissez la valeur JSON_UseIJSONArray sur true pour que IJSONDocument utilise des instances IJSONArray pour maintenir les tableaux, qui utilisent le comptage de référence au lieu d'une copie profonde lors de l'affectation.
Un inconvénient à cela est que l'indexation du tableau simple ( a[i] ) ne fonctionne plus. (Le VariantManager qui pourrait fournir une prise en charge de cela, est déprécié dans Delphi car la version 7.) Utilisez la fonction ja pour extraire facilement une référence IJSONArray à partir d'une variable de variante de type ( ja(a)[i] ).