JSON

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu DataSnap-Anwendungen entwickeln


Der neue Typ JSON wurde hinzugefügt, um die Sichtbarkeit von Servermethoden in der webbasierten Welt zu erhöhen. JSON wird auch intern im Kommunikationsprotokoll zwischen dem DataSnap-Client und -Server verwendet.

JSON-Objekte werden durch die Unit DBXJSON implementiert. Eine weitere wichtige Unit ist DBXJSONReflect, die die Konvertierung zwischen JSON-Objekten und benutzerdefinierten Typen ermöglicht.

Alle JSON-Typen werden unterstützt: TJSONObject, TJSONArray, TJSONNumber, TJSONString, TJSONTrue, TJSONFalse, TJSONNull – alle Nachkommen von TJSONValue.

JSON-Objekte können instantiiert und inkrementell aufgebaut werden, oder ein Byte-Stream kann in ein JSON-Objekt zerlegt werden.

In dem folgenden Codefragment wird ein Objekt mit einem "Hello:World"-Paar erstellt:

 var
   LJSONObject: TJSONObject;
 
 begin
   LJSONObject:= TJSONObject.Create;
   LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create('Hello'),
                                        TJSONString.Create('World')));

Mit der statischen Klassenfunktion ParseJSONValue oder der Funktion Parse kann der Byte-Stream in die entsprechende JSON-Wertinstanz zerlegt werden.

 class function ParseJSONValue(const Data: TBytes; const Offset: Integer): TJSONValue; overload; static;

Zum Beispiel kann die JSON-String-Repräsentation:

 const
   GJSONString =
     '{' +
     '    "name": {'+
     '        "A JSON Object": {' +
     '          "id": "1"' +
     '        },' +
     '        "Another JSON Object": {' +
     '          "id": "2"' +
     '        }' +
     '    },' +
     '    "totalobjects": "2"' +
     '}';

mit einem der folgenden Codefragmente in JSON umgewandelt werden.

1. Verwenden von ParseJSONValue:

 procedure ConsumeJsonString;
 var
   LJSONObject: TJSONObject;
 
 begin
   LJSONObject := nil;
   try
     { convert String to JSON }
     LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(GJSONString), 0) as TJSONObject;
 
     { output the JSON to console as String }
     Writeln(LJSONObject.ToString);
   finally
     LJSONObject.Free;
   end;

2. Verwenden von Parse:

 procedure ConsumeJsonBytes;
 var
   LJSONObject: TJSONObject;
 
 begin
   LJSONObject := nil;
   try
     LJSONObject := TJsonObject.Create;
     { convert String to JSON }
     LJSONObject.Parse(BytesOf(GJSONString), 0);
 
     { output the JSON to console as String }
     Writeln(LJSONObject.ToString);
   finally
     LJSONObject.Free;
   end;
 end;

Beide Codefragmente ergeben folgende Konsolenausgabe:

 {"name":{"A JSON Object":{"id":"1"},"Another JSON Object":{"id":"2"}},"totalobjects":"2"}

Lebenszyklus

In JSON besitzt das übergeordnete Objekt alle Werte, die es enthält, außer deren Eigenschaft Owned ist auf False gesetzt. In diesem Fall werden bei der Freigabe eines JSON-Array-Objekts alle Member übersprungen, deren Flag auf False gesetzt ist. Dadurch wird das Zusammenfügen verschiedener Objekte zu größeren Objekten unter Beibehaltung der Eigentümerschaft möglich. Per Vorgabe ist die Eigenschaft True, das bedeutet, dass alle enthaltenen Instanzen Eigentum des übergeordneten Objekts sind.

Klonen

Alle JSON-Typen können geklont werden. Dabei wird das Verfahren "deep clone" verwendet. Das geklonte Objekt ist Eigentümer aller JSON-Instanzen.

Servermethoden akzeptieren alle JSON-Typen als Eingabe-, Ausgabe- oder Rückgabeparameter. Sie sind aber nicht deren Eigentümer. Die JSON-Instanzen werden nach der Ausführung der Servermethode freigegeben. JSON-Objekte können gelesen werden, und es kann auf deren Inhalt reagiert werden, wenn aber eine weitere Speicherung erforderlich ist, muss das Objekt geklont werden.

Siehe auch