QTでのJSONの使い方
JSON(JavaScript Object Notation)はもともとjavascriptで使われていたデータ記述言語です。
しかし、データの取り扱いが楽で軽量なのでJavascript以外にも多くの場面で使われています。
QTでもJSONを扱うためのクラスが用意されていて、それがQJsonDocumentです。
例えば次のようなjsonファイルを作った場合(文字コードはUTF-8(N))を考えてみます。
{ "Key1":"Value1", "Key2":"Value2", "Key3":"Value3" }
キーと値をペアに持つ3つの要素を持ったJSONオブジェクトが定義されています。
このjsonファイルを読み込んで配列や数値を取り出したい場合は次のようにします。
QFile file("[jsonファイルのパス]"); file.open(QFile::ReadOnly); QTextStream in(&file); QJsonDocument jsonDoc = QJsonDocument::fromJson(in.readAll().toUtf8()); ///JSONファイルから読み込み QJsonObject obj = jsonDoc.object(); QStringList keys = obj.keys(); ///全てのキーを取得 foreach(QString key, keys){ qDebug() << "key = " << key; QString value = obj.value(key).toString(); qDebug() << "value = " << calue; } file.close();
JSONオブジェクトからキーの一覧を取得してそこからそのキーと結びつけられた値を取り出すことができます。
もし配列を定義したい場合は次のようなjsonファイルを作ります。
{ "array":["a","b","c"] }
この配列の値一覧を表示したいならこう書けます。
QJsonArray array = obj.value("array").toArray(); foreach(QJsonValue value, array){ qDebug() << "value = " << value.toString(""); }
このようにQJsonObjectをQJsonArrayに変換するだけです。
このJSONオブジェクト(連想配列みたいなもの)と配列の2つが使ってJSONファイルは成り立っています。
もちろん配列やオブジェクトの中にさらに配列やオブジェクトを入れて入れ子構造にすることも出来ます。
{ "dog":{ "nakigoe":[ "wanwan", "bowwow" ] } "cat":{ "nakigoe":[ "nya-", "mewo" ] } }
これなら複雑なデータ構造も見やすく簡単に書けるから便利ですね。
JSONの決まり事
ここで紹介したようにJSONファイルは軽量でJavaやPHPなどいろいろな言語でサポートされています。
JSONの仕様についてはRFCに詳しく載っています
この中でも重要なことを忘れないようにいくつかメモしておこうと思います。
文字のエスケープ
1つめは文字列の中でダブルクォート(")やバックスラッシュは(\)はエスケープしないといけないということです。
例えば
{"key":"\hello "world"\"}
と書くのは間違いです。正しくは...
{"key":"\\hello \"world\"\\"}
こうします。
エスケープしなければならない文字の前にバックスラッシュ(\)を置いてエスケープできます。
数値には10進数しか使えない
C++やJavaではおなじみの16進数や8進数を使って数を表すことはJSONではできません。
なので次のような書き方は無効です。
{ "hex":0xFF, "oct":010 }
10進数しか使えません。