JSON
マルチデバイス アプリケーションでの RTL の使用 への移動
JSON(JavaScript Object Notation)は、XML や YAML といった他のデータ交換形式の代わりに使用できる軽量のデータ交換形式です。RAD Studio には、System.JSON というユニットが用意されており、この中に、JSON 形式のデータを格納、解析、生成するためのクラスやメソッドが含まれています。
すべての JSON 型がサポートされています。つまり、TJSONObject、TJSONArray、TJSONNumber、TJSONString、TJSONTrue、TJSONFalse、TJSONNull ですが、これらはすべて TJSONValue の下位型です。
JSON オブジェクトをインスタンス化してインクリメンタルに作成することもできますし、バイト ストリームを解析して JSON オブジェクトにすることもできます。
次のコード例では、"Hello": "World"
のペアを持つオブジェクトが作成しています:
var
LJSONObject: TJSONObject;
begin
LJSONObject:= TJSONObject.Create;
LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create('Hello'),
TJSONString.Create('World')));
静的クラス関数 ParseJSONValue または関数 Parse を使用してバイト ストリームを解析し、同等の JSON 値のインスタンスを作成することができます。
class function ParseJSONValue(const Data: TBytes; const Offset: Integer): TJSONValue; overload; static;
たとえば、次のような文字列があるとします。
const
GJSONString =
'{' +
' "name": {'+
' "A JSON Object": {' +
' "id": "1"' +
' },' +
' "Another JSON Object": {' +
' "id": "2"' +
' }' +
' },' +
' "totalobjects": "2"' +
'}';
この JSON 文字列表現を、次のいずれかのコードで JSON に変換することができます。
- 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;
- 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;
どちらのコードでも、コンソールに次の内容が出力されます。
{"name":{"A JSON Object":{"id":"1"},"Another JSON Object":{"id":"2"}},"totalobjects":"2"}
ライフサイクル
JSON では、親オブジェクトがそのオブジェクトに含まれるすべての値を所有します。ただし、Owned プロパティが False に設定されている場合は除きます。JSON 配列オブジェクトを破棄するときに、このフラグが False に設定されているメンバは除外されます。この機能を使うと、所有権は元のままで、さまざまなオブジェクトを組み合わせて大きいオブジェクトを作成することができます。このプロパティのデフォルト値は True です。つまり、含まれるインスタンスはすべて親が所有することになります。
クローン複製
JSON 型はすべてクローンを作成できます。クローン操作は深いクローンです。複製されたオブジェクトは、すべての JSON インスタンスを所有します。
サーバー メソッドは、すべての JSON 型を入力、出力、リターンのパラメータとして受け取ります。しかし、そのパラメータを所有するわけではありません。JSON インスタンスは、サーバー メソッドの実行が終われば解放されます。JSON オブジェクトを読み取ってその内容を処理することは可能ですが、そこからさらに格納する必要がある場合にはオブジェクトを複製しなければなりません。