O JSONDOC começou como Bsondoc.PAs e IBSONDocument no projeto TMONOWIRE. Como era um analisador JSON sólido, baseado em iunknowns (para a contagem de referência) e variantes (eu realmente odeio longas listas de sobrecargas para allândulas de tipos). Surgiu a necessidade de manipular o JSON em vários projetos não relacionados ao MongoDB, de modo que a idéia surgiu para ter um projeto dedicado em torno IJSONDocument .
(Para concluir a mudança, o Tmongowire substituiu bsonDoc.pas por jsonDoc.pas e as funções de conversão separadas para converter de e para BSON.)
Para criar uma nova instância IJSONDocument :
function JSON: IJSONDocument; overload;
Para criar e preencher uma nova instância IJSONDocument :
function JSON(const x: array of Variant): IJSONDocument; overload;
Passe uma lista de teclas e valores alternadamente, sufixo a chave com { para iniciar um documento incorporado e use a chave } para fechá -la. Por exemplo: com
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString retornará {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Converta uma variante em uma referência de ijsondocument.
function JSON(x: Variant): IJSONDocument; overload;
Dependendo do valor do argumento:
IJSONDocument ,nil ,IJSONDocument . Mesclar uma string com dados JSON na instância IJSONDocument , as teclas existentes receberão seus valores substituídos (veja Clear abaixo).
function Parse(const JSONData: WideString): IJSONDocument;
Converta os dados na instância IJSONDocument em uma string json.
function ToString: WideString;
Converta os dados na instância IJSONDocument em uma matriz variante de dimensões [0 .. n , 0..1], onde [ i , 0] segura chaves e [ i , 1] contém valores.
function ToVarArray: Variant;
Limpe os valores do IJSONDocument , mas mantenha a lista de chaves.
procedure Clear;
Ao processar uma sequência de documentos JSON com um conjunto semelhante de chaves (e chaves de documentos incorporados), o desempenho pode ser obtido evitando a de- e re-alocação da memória para armazenar as teclas (e o registro variante de seus valores). (Veja também IJSONDocArray abaixo).
Recuperar um valor por chave. Esta é a propriedade padrão, para que você possa acessar as chaves de um documento de índice de IJSONDocument (por exemplo: d['id'] ).
property Item[const Key: WideString]: Variant; default;
ATENÇÃO: Por padrão, a implementação IJSONDocument : TJSONDocument não é segura para threads. Use os métodos adequados de bloqueio e sincronização para garantir que apenas um thread acesse uma instância ao mesmo tempo ou declare que define JSONDOC_THREADSAFE .
Crie uma instância IJSONEnumerator para uma referência de IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Verifique se o enumerador já passou do final do conjunto de chaves do documento.
function EOF: boolean;
Mova o iterador para o próximo item no conjunto. Move o iterador para o primeiro item na primeira chamada. Retorna falsa quando passada pelo final do conjunto.
function Next: boolean;
Retorna a chave ou valor do item atual no conjunto.
function Key: WideString;
function Value: Variant;
Retorna a chave ou valor do item atual no conjunto.
Use uma instância IJSONDocArray para armazenar um conjunto de documentos JSON semelhantes. O JSON é convertido de e para strings internamente para economizar no uso da memória. Use LoadItem com uma única instância IJSONDocument para reutilizar as teclas e salvar na alocação de memória. Pré-carregue um pai-pai com uma instância IJSONDocArray IJSONDocument adiar parte da análise dos documentos das crianças.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Anexe um documento à matriz.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Recupere um documento usando uma instância existente IJSONDocument , possivelmente reutilizando as teclas alocadas.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Recupere o número de documentos na matriz.
function Count: integer; stdcall;
Converta os dados na instância IJSONDocArray em uma string json.
function ToString: WideString; stdcall;
Recupere um documento por índice, em uma nova instância IJSONDocument . Esta é a propriedade padrão, para que você possa usar a notação de índice (por exemplo: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Se você precisar processar documentos que contenham muitas e/ou grandes matrizes, algum desempenho pode se perder porque a manipulação de matrizes variantes executa uma cópia profunda na tarefa por padrão.
Para evitar isso, defina o valor JSON_UseIJSONArray como True para que o IJSONDocument use Instâncias IJSONArray para manter matrizes, que usam a contagem de referência em vez de cópia profunda na atribuição.
Uma desvantagem disso é que não funciona mais a matriz simples ( a[i] ). (O VariantManager que poderia fornecer suporte para isso é descontinuado em Delphi desde a versão 7.) Use a função ja para extrair convenientemente uma referência IJSONArray de uma variável de variante de tipo ( ja(a)[i] ).