JSondoc comenzó como BSondoc.pas e IBSONDocument en el proyecto Tmongowire. Dado que se trataba de un analizador JSON sólido, basado en Iunknowns (para el conteo de referencia) y las variantes (realmente odio las largas listas de sobrecargas para AllKinds of Tipos). La necesidad surgió para manipular JSON en varios proyectos no relacionados con MongoDB, por lo que surgió la idea de tener un proyecto dedicado en torno a IJSONDocument .
(Para completar el movimiento, Tmongowire ha reemplazado desde entonces bsonDoc.pas con jsonDoc.pas y funciones de conversión separadas para convertir desde y a BSON).
Para crear una nueva instancia IJSONDocument :
function JSON: IJSONDocument; overload;
Para crear y llenar una nueva instancia IJSONDocument :
function JSON(const x: array of Variant): IJSONDocument; overload;
Pase una lista de claves y valores alternativamente, sufice la clave con { para iniciar un documento incrustado y use la clave } para cerrarla. Por ejemplo: con
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString volverá {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Convierta una variante en una referencia de IJSondocument.
function JSON(x: Variant): IJSONDocument; overload;
Dependiendo del valor del argumento:
IJSONDocument ,nil ,IJSONDocument . Fusionar una cadena con los datos JSON en la instancia IJSONDocument , las claves existentes se sobrescribirán sus valores (ver Clear a continuación).
function Parse(const JSONData: WideString): IJSONDocument;
Convierta los datos en la instancia IJSONDocument en una cadena JSON.
function ToString: WideString;
Convierta los datos en la instancia IJSONDocument en una variante matriz de dimensiones [0 .. n , 0..1], donde [ i , 0] contiene claves y [ i , 1] contiene valores.
function ToVarArray: Variant;
Borre los valores del IJSONDocument , pero mantenga la lista de claves.
procedure Clear;
Al procesar una secuencia de documentos JSON con un conjunto similar de claves (y claves de documentos incrustados), el rendimiento se puede obtener evitando la desactivación de la memoria para almacenar las claves (y el registro variante de sus valores). (Ver también IJSONDocArray a continuación).
Recuperar un valor por clave. Esta es la propiedad predeterminada, por lo que puede acceder a las claves de un IJSONDocument por notación de índice (por ejemplo: d['id'] ).
property Item[const Key: WideString]: Variant; default;
ATENCIÓN: Por defecto, la implementación IJSONDocument : TJSONDocument no es segura. Utilice los métodos de bloqueo y sincronización adecuados para garantizar que solo un hilo acceda a una instancia a la vez, o declare la define condicional JSONDOC_THREADSAFE .
Cree una instancia IJSONEnumerator para una referencia IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Compruebe si el enumerador ha pasado el final del conjunto de claves del documento.
function EOF: boolean;
Mueva el iterador al siguiente elemento en el conjunto. Mueve el iterador al primer elemento de la primera llamada. Devuelve falso cuando se mueve más allá del final del conjunto.
function Next: boolean;
Devuelve la clave o valor del elemento actual en el conjunto.
function Key: WideString;
function Value: Variant;
Devuelve la clave o valor del elemento actual en el conjunto.
Use una instancia IJSONDocArray para almacenar un conjunto de documentos JSON similares. JSON se convierte hacia y desde las cuerdas internamente para ahorrar en el uso de la memoria. Use LoadItem con una única instancia IJSONDocument para reutilizar las claves y guardar en la asignación de memoria. Pre-cargue un padre IJSONDocument con una instancia IJSONDocArray para posponer parte del análisis de los documentos de los niños.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Agregue un documento a la matriz.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Recupere un documento utilizando una instancia IJSONDocument existente, posiblemente reutilizando las claves asignadas.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Recupere el número de documentos en la matriz.
function Count: integer; stdcall;
Convierta los datos en la instancia IJSONDocArray en una cadena JSON.
function ToString: WideString; stdcall;
Recupere un documento por índice, en una nueva instancia IJSONDocument . Esta es la propiedad predeterminada, por lo que puede usar la notación del índice (por ejemplo: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Si necesita procesar documentos que contengan muchas y/o grandes matrices, se puede perder parte de rendimiento porque la manipulación de matrices de variantes realiza una copia profunda en la asignación de forma predeterminada.
Para evitar esto, establezca el valor JSON_UseIJSONArray en verdadero para que IJSONDocument use instancias IJSONArray para mantener matrices, que usan conteo de referencia en lugar de copia profunda en la asignación.
Un inconveniente de esto es que la indexación de matriz simple ( a[i] ) ya no funciona. (El VariantManager que podría proporcionar soporte para esto, está en desuso en Delphi desde la versión 7.) Use la función ja para extraer convenientemente una referencia IJSONArray de una variable de variante de tipo ( ja(a)[i] ).