JSON オブジェクト フレームワーク

提供: RAD Studio
移動先: 案内検索

JSON への移動


RAD Studio には、System.JSON というユニットが用意されており、この中に、JSON 形式のデータを格納、解析、生成するためのクラスやメソッドが含まれています。

メモ: これは、JSON オブジェクト フレームワークについて記述されたページです。RAD Studio が提供するその他の JSON フレームワークを確認するには、「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
        { convert String to JSON }
        LJSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(GJSONString), 0) as TJSONObject;
    
        { output the JSON to console as String }
        Writeln(LJSONObject.ToString);
      finally
        LJSONObject.Free;
      end;
    
  2. 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 オブジェクトを読み取ってその内容を処理することは可能ですが、そこからさらに格納する必要がある場合にはオブジェクトを複製しなければなりません。

関連項目