JSON

Aus RAD Studio
Wechseln zu: Navigation, Suche

{{Parent|Verwenden der RTL in geräteübergreifenden Anwendungen}

JSON (JavaScript Object Notation) ist ein sprachunabhängiges, schlankes Datenaustauschformat. JSON kann als Alternative für andere Datenaustauschformate wie XML oder YAML verwendet werden.

RAD Studio stellt die JSON-Frameworks bereit, die Klassen und Methoden zum Speichern, Analysieren, Lesen, Schreiben und Generieren von Daten im JSON-Format enthalten.

JSON-Frameworks

RAD Studio enthält verschiedene Frameworks zur Verarbeitung von JSON-Daten.

Framework der JSON-Objekte

Das Framework der JSON-Objekte erfordert, dass Sie ein temporäres Objekt zum Analysieren oder Generieren von JSON-Daten erstellen. Um JSON-Daten zu lesen oder zu schreiben, müssen Sie vor dem Lesen oder Schreiben von JSON-Daten ein Zwischenspeicherobjekt, wie TJSONObject, TJSONArray oder TJSONString, erstellen.

Weitere Einzelheiten zu diesem Framework finden Sie unter Framework der JSON-Objekte.

JSON-Framework der Reader und Writer

Mit dem JSON-Framework der Reader und Writer können Sie JSON-Daten direkt in einen Stream schreiben bzw. daraus lesen, ohne dass Sie ein temporäres Objekt erstellen müssen. Da Sie zum Lesen und Schreiben von JSON kein temporäres Objekt erstellen müssen, bietet dieses Framework eine bessere Leistung und verringert den Speicherbedarf.

Im Gegensatz zum Framework der JSON-Objekte stellt das JSON-Framework der Reader und Writer Unterstützung für BSON bereit.

Weitere Einzelheiten zu diesem Framework finden Sie unter JSON-Framework der Reader und Writer.

Unterschiede zwischen den JSON-Frameworks

Beide Frameworks sind für die Arbeit mit JSON-Daten geeignet. Sie können je nach den Anforderungen des Projekts das eine oder das andere Framework verwenden. Die folgende Tabelle enthält einige der Hauptunterschiede zwischen den beiden JSON-Frameworks.

Framework der JSON-Objekte
  • Einfachere Möglichkeit zum Lesen einer JSON-Struktur, ermöglicht Iterationen und Änderungen in der Modellhierarchie.
JSON-Framework der Reader und Writer
  • Schreibt JSON-Daten sequenziell in einem Stream bzw. liest sie daraus, wodurch der Speicherbedarf verringert wird.
  • BSON-Unterstützung.
  • Erweiterbar.

Die folgende Tabelle enthält drei Codefragmente, die die Unterschiede zwischen den beiden Frameworks beim Schreiben von JSON-Daten illustrieren.

Framework der JSON-Objekte JSON-Framework der Reader und Writer: TJSonWriter JSON-Framework der Reader und Writer: TJSONObjectBuilder
JSONColor := TJSONObject.Create;
JSONColor.AddPair('name', 'red');
JSONColor.AddPair('hex', '#f00');
JSONArray := TJSONArray.Create;
JSONArray.Add(JSONColor);
JSONObject := TJSONObject.Create;
JSONObject.AddPair('colors', JSONArray);
Writer.WriteStartObject;
Writer.WritePropertyName('colors');
Writer.WriteStartArray;
Writer.WriteStartObject;
Writer.WritePropertyName('name');
Writer.WriteValue('red');
Writer.WritePropertyName('hex');
Writer.WriteValue('#f00');
Writer.WriteEndObject;
Writer.WriteEndArray;
Writer.WriteEndObject;
Builder := TJSONObjectBuilder.Create(Writer);
  Builder
    .BeginObject
      .BeginArray('colors')
        .BeginObject
          .Add('name', 'red')
          .Add('hex', '#f00')
        .EndObject
    .EndArray
  .EndObject;

Die drei Codefragmente aus der obigen Tabellen schreiben die folgenden JSON-Daten:

{
   "colors":[
      {
         "name":"red",
         "hex":"#f00"
      }
   ]
}


Die folgende Tabelle enthält drei Codefragmente, die die Unterschiede zwischen den beiden Frameworks beim Lesen von JSON-Daten illustrieren.

Framework der JSON-Objekte JSON-Framework der Reader und Writer: TJSonReader JSON-Framework der Reader und Writer: TJSONIterator
JSONValue := TJSONObject.ParseJSONValue('{"colors":[{"name":"red", "hex":"#f00"}]}');

Memo1.Lines.Add('READER:');
if JSONValue is TJSONArray then
  //... 
else if JSONVAlue is TJSONObject then
  Memo1.Lines.Add('colors');
  Memo1.Lines.Add('name: '+ JSONValue.GetValue<string>('colors[0].name'));
  Memo1.Lines.Add('hex: '+ JSONValue.GetValue<string>('colors[0].hex'));
LStringReader := TStringReader.Create('{"colors":[{"name":"red", "hex":"#f00"}]}');
LJsonTextReader := TJsonTextReader.Create(LStringReader);

while LJsonTextReader.read do
  case LJsonTextReader.TokenType of
    TJsonToken.PropertyName:
    Memo1.Lines.Add(LJsonTextReader.Value.AsString);
	TJsonToken.String:
    Memo1.Lines[Memo1.Lines.Count-1] := Memo1.Lines[Memo1.Lines.Count-1] + ': ' +LJsonTextReader.Value.AsString;
  end;
LStringReader := TStringReader.Create('{"colors":[{"name":"red", "hex":"#f00"}]}');
LJsonTextReader := TJsonTextReader.Create(LStringReader);
LIterator := TJSONIterator.Create(LJsonTextReader);

LIterator.Recurse;
LIterator.Next;
Memo1.Lines.Add(LIterator.Key);
LIterator.Recurse;
LIterator.Recurse;
LIterator.Next;
LIterator.Recurse;
LIterator.Next;
Memo1.Lines.Add(LIterator.Key +': '+ LIterator.AsString);
LIterator.Next;
Memo1.Lines.Add(LIterator.Key +': '+ LIterator.AsString);

Die drei Codefragmente aus der obigen Tabellen fügen einem TMemo Folgendes hinzu.

colors
name: red
hex: #f00

Verbesserungen der JSON-Verarbeitung und -Analyse in 10.3

  • Die Richtigkeit des JSON-Codes wurde in Bezug auf den von der Klasse TJSONValue und davon abgeleiteter Klassen generierten JSON-Code sowie hinsichtlich der Analyse verbessert. Zudem wurde die Leistung verbessert.
  • Neue TAsciiStreamWriter-Klasse: Diese Klasse kann mit der Klasse TJsonTextWriter kombiniert werden, um die beste Leistung bei der Generierung von JSON-Strings zu erzielen (weniger Konvertierungen).
  • Zusätzliche JSON-Ausgabe mit Quelltextformatierung und mit dem neuen Format TJSONAncestor.Format(Indentation: Integer = 4). Als Folge davon ist TJSON.Format nun veraltet.
  • TJSONAncestor.ToJSON erzeugt nun immer einen formal gültigen JSON-String. TJSONAncestor.ToString erzeugt einen ähnlichen JSON-String, aber ohne Konvertierung von Nicht-ASCII-Symbolen nach \uNNNN.
  • Die Unterstützung der JSON-Analyse zeigt bei Fehlern im JSON-Quelltext ein neues Verhalten. Es gibt eine neue Option, TJSONObject.TJSONParseOption.RaiseExc, die festlegt, ob die Methode ParseJSONValue bei ungültigem JSON eine Exception mit dem Typ EJSONParseException auslöst oder nil zurückgibt (wie in der Vergangenheit). Wenn die Exception aktiviert ist, gibt TJSONObject.ParseJSONValue jetzt die Fehlerposition zurück und löst die neue System.JSON.EJSONParseException (die die Eigenschaften Path, Offset, Line und Position hat) aus. Außerdem hat die Methode TJSONObject.ParseJSONValue nun einen dritten neuen Parameter: RaiseExc, der die globale Einstellung überschreibt, was bei JSON-Analysefehlern das Auslösen der Exception verursacht.

JSON-Themen

  • JSON-Frameworks:

Siehe auch

Codebeispiele