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の時の処理 */ }
いつもこちらの情報を利用させてもらってます。
このARRAY部分をDELPHI用に翻訳いただけないでしょうか?
情報が無くて困ってます。よろしくお願いします。
Delpihで書き直しました。
http://www.gesource.jp/weblog/?p=7362
参考になれば幸いです。