JSON
{{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.
Inhaltsverzeichnis
JSON-Frameworks
RAD Studio enthält verschiedene Frameworks zur Verarbeitung von JSON-Daten.
- Framework der JSON-Objekte: Dieses Framework erstellt temporäre Objekte zum Lesen und Schreiben von JSON-Daten.
- JSON-Framework der Reader und Writer: Dieses Framework ermöglicht das direkte Lesen und Schreiben 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 |
|
---|---|
JSON-Framework der Reader und Writer |
|
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: