Anzeigen: Object Pascal C++
Anzeigeeinstellungen

JSON

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden der RTL in geräteübergreifenden Anwendungen


JSON (JavaScript Object Notation) ist ein schlankes Format für den Datenaustausch, das als Alternative für andere Datenaustauschformate wie XML oder YAML verwendet werden kann. Appmethod stellt die Unit System.JSON bereit, die Klassen und Methoden zum Speichern, Analysieren und Generieren von Daten im JSON-Format enthält.

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;
  1. 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-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.

Meine Werkzeuge
In anderen Sprachen