JSON

提供: Appmethod Topics
移動先: 案内検索

RTL の使用:インデックス への移動


JSON(JavaScript Object Notation)は、XML や YAML といった他のデータ交換形式の代わりに使用できる軽量のデータ交換形式です。Appmethod には、System.JSON というユニットが用意されており、この中に、JSON 形式のデータを格納、解析、生成するためのクラスやメソッドが含まれています。

すべての JSON 型がサポートされています。つまり、TJSONObjectTJSONArrayTJSONNumberTJSONStringTJSONTrueTJSONFalseTJSONNull ですが、これらはすべて 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 に変換することができます。

1. ParseJSONValue を使用する場合:

procedure ConsumeJsonString;
var
  LJSONObject: TJSONObject;

begin
  LJSONObject := nil;
  try
    { 文字列を JSON に変換 }
    LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(GJSONString), 0) as TJSONObject;

    { JSON 表現を文字列としてコンソールに出力 }
    Writeln(LJSONObject.ToString);
  finally
    LJSONObject.Free;
  end;

2. Parse を使用する場合:

procedure ConsumeJsonBytes;
var
  LJSONObject: TJSONObject;

begin
  LJSONObject := nil;
  try
    LJSONObject := TJsonObject.Create;
    { 文字列を JSON に変換 }
    LJSONObject.Parse(BytesOf(GJSONString), 0);

    { JSON 表現を文字列としてコンソールに出力 }
    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 オブジェクトを読み取ってその内容を処理することは可能ですが、そこからさらに格納する必要がある場合にはオブジェクトを複製しなければなりません。