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
10.3 における JSON の処理と解析の向上
- TJSONValue クラスおよびその派生クラスによって生成される JSON コードについて、コードの精度が向上しましたが、解析面でも同様の向上が見られます。 また、パフォーマンス向上についても取り組んできました。
- 新しい TAsciiStreamWriter クラス: このクラスは、TJsonTextWriter と組み合わせて、最も優れた JSON 文字列生成パフォーマンス(より少ない変換で)を実現しています。
- 新たな TJSONAncestor.Format(Indentation: Integer = 4) の導入により、JSON 出力「かわいい出力」が追加されました。 これにより、TJSON.Format は廃止されます。
- TJSONAncestor.ToJSON は、正式に有効な JSON 文字列を常に生成するようになりました。一方、TJSONAncestor.ToString は同様の JSON 文字列を生成しますが、非 ASCII シンボルを \uNNNN に変換しません。
- JSON 解析のサポートでは、JSON ソース テキストにおいてエラーが発生した場合には、新しい動作をするようになりました。 不正な JSON の場合、もしくは nil が返された場合(今までのように)、ParseJSONValue メソッドが EJSONParseException 型の例外を挙げるがどうかを決定する、新しいオプション、TJSONObject.TJSONParseOption.RaiseExc があります。 例外が有効な場合、TJSONObject.ParseJSONValue は新しい System.JSON.EJSONParseException(プロパティ群 Path、Offset、Line、Position を保有する)を発生させて、エラーの位置を返すようになりました。 さらに、メソッド TJSONObject.ParseJSONValue には 3 つめの新しいパラメータができました: RaiseExc -- これは、JSON 解析エラーの場合に、例外を発生させるぐるーばる設定をオーバーライドします。
JSON 関連トピック
- JSON フレームワーク: