TJSONObjectでJSONデータを解析する

TJSONObject(DBXJSONユニット)でJSONデータを解析する方法をちょっと調べたのでまとめました。

必要なヘッダ

#include <DBXJSON.hpp>

TJSONObject::ParseJSONValueでJSONデータを読み込みます。

UnicodeString jsonText = "{\"name\": \"John Smith\", \"age\": 33}";
TJSONObject* obj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

Size()メソッドでJSON オブジェクトに格納されているペアの数を取得します。

int size = obj->Size(); //=> 2

ペアを取得するにはGet()メソッドを使用します。
引数にはインデックスかペアの名前を指定します。
該当する要素がない時、Get()メソッドはNULLを返します。

TJSONPair* pair = obj->Get(0); //インデックスで指定
TJSONPair* pair = obj->Get("name"); //名前で指定

TJSONPairオブジェクトのJsonStringプロパティでJSONペアの名前部分を、JsonValueプロパティでJSON ペアの値部分を取得します。

UnicodeString s = pair->JsonString->Value(); //=> name
UnicodeString v = pair->JsonValue->Value(); //=> John Smith

文字列型以外のときはデータ型にあわせてキャストします。

数値型の時はTJSONNumberを使用します。

TJSONPair* pair = obj->Get(1);

UnicodeString sc = pair->JsonString->ClassName(); //=> TJSONString
UnicodeString s = pair->JsonString->Value(); //=> age

UnicodeString vc = pair->JsonValue->ClassName(); //=> TJSONNumber
UnicodeString v = pair->JsonValue->Value(); //=> 33

TJSONNumber* nc = dynamic_cast<TJSONNumber*>(pair->JsonValue);
int num = nc->AsInt; //=> 33

配列型の時はTJSONArrayを使用します。

UnicodeString jsonText = L"{\"index\": 1, \"items\": [\"item 1\", \"item 2\", \"item 3\"]}";
TJSONObject* obj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

TJSONPair* pair = obj->Get(1);
UnicodeString s = pair->JsonString->Value(); //=> items

TJSONArray* v = dynamic_cast<TJSONArray*>(pair->JsonValue);
int size = v->Size(); //=> 3
for (int i = 0; i < size; ++i)
{
  TJSONValue* jv = v->Get(i);
  UnicodeString v = jv->Value();
}

真偽値のときはTJSONTrueかTJSONFalseになります。

if (dynamic_cast<TJSONTrue*>(pair->JsonValue)) { /* trueの時の処理 */ }
if (dynamic_cast<TJSONFalse*>(pair->JsonValue)) { /* falseの時の処理 */ }

DelphiのJSON関連の記事

コメント

  1. いつもこちらの情報を利用させてもらってます。

    このARRAY部分をDELPHI用に翻訳いただけないでしょうか?

    情報が無くて困ってます。よろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください