Framework der JSON-Objekte

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu JSON


RAD Studio stellt die Unit System.JSON bereit, die Klassen und Methoden zum Speichern, Analysieren und Generieren von Daten im JSON-Format enthält.

Hinweis: Diese Seite betrifft nur das Framework der JSON-Objekte. Weitere von RAD Studio bereitgestellten JSON-Frameworks finden Sie unter JSON-Framework der Reader und Writer.

Das Framework der JSON-Objekte unterstützt alle JSON-Typen: TJSONObject, TJSONArray, TJSONNumber, TJSONString, TJSONTrue, TJSONFalse, TJSONNull - sind 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.UTF8.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 ist das übergeordnete Objekt Eigentümer aller Werte, die es enthält, außer deren Eigenschaft Owned ist auf False gesetzt. In diesem Fall werden bei der Freigabe eines JSON-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