JSON

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

マルチデバイス アプリケーションでの RTL の使用 への移動


JSON(JavaScript Object Notation)は、言語非依存の軽量のデータ交換形式です。XML や YAML といった他のデータ交換形式の代わりに使用できます。

RAD Studio には JSON フレームワークが用意されていて、その中に、JSON 形式のデータを格納、解析、読み取り、書き込み、生成するためのクラスやメソッドが含まれています。

JSON フレームワーク

RAD Studio では、JSON データを処理するための次のフレームワークを提供しています。

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

JSON オブジェクト フレームワークでは、JSON データの解析や生成を行うために一時オブジェクトを作成する必要があります。JSON データを読み書きするには、TJSONObjectTJSONArrayTJSONString などの中間メモリ オブジェクトを作成してから、JSONを読み書きする必要があります。

このフレームワークの詳細は、「JSON オブジェクト フレームワーク」を参照してください。

JSON リーダー/ライタ フレームワーク

JSON リーダー/ライタ フレームワークでは、一時オブジェクトを作成することなく、ストリームに対して JSON データを直接読み書きすることができます。JSON の読み書きに一時オブジェクトを作成する必要がないため、こちらのフレームワークの方がパフォーマンスがよく、メモリ消費量も抑えられます。

JSON オブジェクト フレームワークとは異なり、JSON リーダー/ライタ フレームワークでは BSON をサポートしています。

このフレームワークの詳細は、「JSON リーダー/ライタ フレームワーク」を参照してください。

JSON フレームワーク間の違い

JSON データを扱うときには、この 2 つのフレームワークのどちらでも使用することができます。プロジェクトのニーズに合わせて選択できます。次の表は、2 つの JSON フレームワークの主な違いをまとめたものです。

JSON オブジェクト フレームワーク
  • JSON 構造を読み取りやすく、モデル ツリー内での順次処理や変更が可能。
JSON リーダー/ライタ フレームワーク
  • ストリーム内の JSON を順に読み書きするため、メモリ消費量を削減できる。
  • BSON をサポート。
  • 拡張可能。

次の表の 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 フレームワーク:

関連項目

コード サンプル