JSondoc begann im Tmongowire -Projekt als BSondoc.pas und IBSONDocument . Da es sich um einen soliden JSON -Parser handelte, basierend auf iUunkNowns (zur Referenzzählung) und Varianten (ich hasse wirklich, lange Listen von Überladungen für Alkinds von Typen wirklich). Das Bedürfnis entstand, JSON in mehreren Projekten zu manipulieren, die nicht mit MongoDB zu tun haben. Daher tauchte die Idee auf, ein spezielles Projekt rund um IJSONDocument zu haben.
(Um den Umzug zu vervollständigen, hat Tmongowire seitdem bsonDoc.pas durch jsonDoc.pas und separate Konvertierungsfunktionen ersetzt, um sie von und nach BSON zu konvertieren.)
Um eine neue IJSONDocument -Instanz zu erstellen:
function JSON: IJSONDocument; overload;
Um eine neue IJSONDocument -Instanz zu erstellen und zu bevölkern:
function JSON(const x: array of Variant): IJSONDocument; overload;
Geben Sie eine Liste mit abwechselnd Schlüsseln und Werten über, säuen Sie den Schlüssel mit { um ein eingebettetes Dokument zu starten, und verwenden Sie den Schlüssel } , um ihn zu schließen. ZB: mit
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString wird {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Konvertieren Sie eine Variante in eine iJSondocument -Referenz.
function JSON(x: Variant): IJSONDocument; overload;
Abhängig vom Wert des Arguments:
IJSONDocument -Instanz analysiert,nil zurück,IJSONDocument Instace untersucht. Fusionieren Sie eine Zeichenfolge mit JSON -Daten in die IJSONDocument -Instanz. Bestehende Schlüssel erhalten ihre Werte überschrieben (siehe Clear ).
function Parse(const JSONData: WideString): IJSONDocument;
Konvertieren Sie die Daten in der IJSONDocument -Instanz in eine JSON -Zeichenfolge.
function ToString: WideString;
Konvertieren Sie die Daten in der IJSONDocument -Instanz in ein Variante -Array von Dimensionen [0 .. n , 0..1], wobei [ i , 0] Schlüssel und [ i , 1] Werte enthält.
function ToVarArray: Variant;
Löschen Sie die Werte des IJSONDocument , behalten Sie aber die Liste der Schlüssel.
procedure Clear;
Bei der Verarbeitung einer Abfolge von JSON-Dokumenten mit einem ähnlichen Schlüssel (und Schlüssel der eingebetteten Dokumente) kann die Leistung erzielt werden, indem die De- und Neuzuordnung des Speichers zur Speicherung der Schlüssel (und des Variantenaufzeichnungen für ihre Werte) vermieden wird. (Siehe auch IJSONDocArray unten).
Einen Wert nach Schlüssel abrufen. Dies ist die Standardeigenschaft, sodass Sie durch Indexnotation auf die Schlüssel eines IJSONDocument zugreifen können (z. d['id'] ).
property Item[const Key: WideString]: Variant; default;
Achtung: Standardmäßig ist die IJSONDocument Implementierung: TJSONDocument ist nicht mit Thread-Safe. Bitte verwenden Sie die ordnungsgemäßen Verriegelungs- und Synchronisationsmethoden, um sicherzustellen, dass nur ein Thread gleichzeitig auf eine Instanz zugreift oder bedingte Definieren JSONDOC_THREADSAFE .
Erstellen Sie eine IJSONEnumerator -Instanz für eine IJSONDocument -Referenz.
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Überprüfen Sie, ob der Enumerator über das Ende des Schlüssels der Dokumente hinausgeht.
function EOF: boolean;
Bewegen Sie den Iterator zum nächsten Element im Set. Verschiebt den Iterator beim ersten Anruf zum ersten Element. Gibt false zurück, wenn sie am Ende des Sets vorbei bewegt werden.
function Next: boolean;
Gibt den Schlüssel oder den Wert des aktuellen Elements im Satz zurück.
function Key: WideString;
function Value: Variant;
Gibt den Schlüssel oder den Wert des aktuellen Elements im Satz zurück.
Verwenden Sie eine IJSONDocArray -Instanz, um eine Reihe ähnlicher JSON -Dokumente zu speichern. JSON wird in und von den Saiten intern konvertiert, um die Speichernutzung zu sparen. Verwenden Sie LoadItem mit einer einzelnen IJSONDocument Instanz, um Schlüssel wieder zu verwenden und die Speicherzuweisung zu speichern. Laden Sie ein übergeordnetes IJSONDocument mit einer IJSONDocArray Instanz vor, um einige der Analysen der Kinderdokumente zu verschieben.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Gehen Sie ein Dokument an das Array an.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Abrufen Sie ein Dokument mit einer vorhandenen IJSONDocument Instanz ab und verwenden Sie möglicherweise zugewiesene Schlüssel.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Abrufen Sie die Anzahl der Dokumente im Array ab.
function Count: integer; stdcall;
Konvertieren Sie die Daten in der IJSONDocArray -Instanz in eine JSON -Zeichenfolge.
function ToString: WideString; stdcall;
Abrufen Sie ein Dokument nach Index in einer neuen IJSONDocument -Instanz ab. Dies ist die Standardeigenschaft, sodass Sie die Indexnotation verwenden können (z. B. a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Wenn Sie Dokumente verarbeiten müssen, die viele und/oder große Arrays enthalten, kann eine gewisse Leistung verloren gehen, da die Manipulation von Varianten -Arrays standardmäßig eine tiefe Kopie für die Zuordnung durchführen.
Um dies zu verhindern, setzen Sie den Wert von JSON_UseIJSONArray auf True, um IJSONDocument IJSONArray -Instanzen zu verwenden, um Arrays zu halten, die Referenzzählung anstelle einer tiefen Kopie für die Zuordnung verwenden.
Ein Nachteil davon ist, dass einfaches Array-Indexing ( a[i] ) nicht mehr funktioniert. (Der VariantManager , der dies unterstützen könnte, ist in Delphi veraltet, da Version 7.) Verwenden Sie die ja -Funktion, um eine IJSONArray -Referenz aus einer Variablen der Typvariante ( ja(a)[i] ] bequem zu extrahieren.