JSON
マルチデバイス アプリケーションでの RTL の使用 への移動
JSON(JavaScript Object Notation)は、言語非依存の軽量のデータ交換形式です。XML や YAML といった他のデータ交換形式の代わりに使用できます。
RAD Studio には JSON フレームワークが用意されていて、その中に、JSON 形式のデータを格納、解析、読み取り、書き込み、生成するためのクラスやメソッドが含まれています。
目次
JSON フレームワーク
RAD Studio では、JSON データを処理するための次のフレームワークを提供しています。
- JSON オブジェクト フレームワーク: このフレームワークでは、一時オブジェクトを作成して JSON データの読み書きを行います。
- JSON リーダー/ライタ フレームワーク: このフレームワークでは、JSON データを直接読み書きすることができます。
JSON オブジェクト フレームワーク
JSON オブジェクト フレームワークでは、JSON データの解析や生成を行うために一時オブジェクトを作成する必要があります。JSON データを読み書きするには、TJSONObject、TJSONArray、TJSONString などの中間メモリ オブジェクトを作成してから、JSONを読み書きする必要があります。
このフレームワークの詳細は、「JSON オブジェクト フレームワーク」を参照してください。
JSON リーダー/ライタ フレームワーク
JSON リーダー/ライタ フレームワークでは、一時オブジェクトを作成することなく、ストリームに対して JSON データを直接読み書きすることができます。JSON の読み書きに一時オブジェクトを作成する必要がないため、こちらのフレームワークの方がパフォーマンスがよく、メモリ消費量も抑えられます。
JSON オブジェクト フレームワークとは異なり、JSON リーダー/ライタ フレームワークでは BSON をサポートしています。
このフレームワークの詳細は、「JSON リーダー/ライタ フレームワーク」を参照してください。
JSON フレームワーク間の違い
JSON データを扱うときには、この 2 つのフレームワークのどちらでも使用することができます。プロジェクトのニーズに合わせて選択できます。次の表は、2 つの JSON フレームワークの主な違いをまとめたものです。
JSON オブジェクト フレームワーク |
|
---|---|
JSON リーダー/ライタ フレームワーク |
|
次の表の 3 つのコードは、フレームワーク間での JSON の書き込み方の違いを示しています。
JSON オブジェクト フレームワーク | JSON リーダー/ライタ フレームワーク: TJSonWriter | JSON リーダー/ライタ フレームワーク: 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;
|
上の表の 3 つのコードでは、次の JSON を書き込みます。
{
"colors":[
{
"name":"red",
"hex":"#f00"
}
]
}
次の表の 3 つのコードは、フレームワーク間での JSON の読み取り方の違いを示しています。
JSON オブジェクト フレームワーク | JSON リーダー/ライタ フレームワーク: TJSonReader | JSON リーダー/ライタ フレームワーク: 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);
|
上の表の 3 つのコードでは、以下の内容を TMemo に追加します。
colors name: red hex: #f00
JSON 関連トピック
- JSON フレームワーク: