はじめに
自作アプリの設定を、JSON形式で読み書きしたいと思い、その方法を調べたのでまとめます。
JSON形式で保存するまでの流れ
-
QJsonObjectのインスタンスを作成
QJsonObject jsonObj;
-
1で作成したインスタンスにデータを記録
// インスタンス[キー] = 値; jsonObj["name"] = m_userName;
配列を記録したいときは、QJsonArrayのインスタンスを作成し、それを代入します。
QJsonArray jsonArr; for (auto name : m_nameList) { jsonArr.append(name); } jsonObj["nameList"] = jsonArr;
-
QJsonObjectから、QJsonDocumentインスタンスを作成
QJsonDocument jsonDoc(jsonObj);
-
QJsonDocumentインスタンスからQByteArrayを取得
// JSON形式 QByteArray data(jsonDoc.toJson());
バイナリ形式で書き出す場合はtoBinaryData()を使います
// バイナリ形式 QByteArray data(jsonDoc.toBinaryData());
-
ファイルオブジェクトに書き込む
QFile saveFile(filename); saveFile.open(QIODevice::WriteOnly); saveFile.write(data); saveFile.close();
JSON形式のデータを読み込むまでの流れ
-
データをバイト列として読み込む
QFile openFile(QIODevice::ReadOnly); QByteArray data = openFile.readAll();
-
読み込んだデータから、QJsonDocumentを作成する
// JSON形式で書き出されたファイルを読み込む時 QJsonDocument jsonDoc(QJsonDocument::fromJson(data));
バイナリ形式で書き出されたファイルを読む場合は、fromBinaryDataを使います
// バイナリ形式で書き出されたファイルを読み込む時 QJsonDocument jsonDoc(QJsonDocument::fromBinaryData(data));
-
QJsonDocument::object()を使って、QJsonObjectを取得する
QJsonObject jsonObj(jsonDoc.object());
-
QJsonObjectから値を読みだす
読み出した値は、適切な型に変換する必要があります
m_name = jsonObj["name"].toString(); QJsonArray jsonArr = jsonObj["nameList"]; for (auto filePath : jsonArr) { filePathList << filePath.toString(); }
詳しい使い方や実例は、公式サイトにものっているので参照してください。
Qt Documentation - JSON Save Game Example
上記サイトでは、データを保持するクラスに、QJsonObjectにデータを読み書きするためのメンバ関数、read(QJsonObject &json)、write(const QJsonObject &json)をもたせています。
サンプル
JSON形式でファイルを読み書きするサンプルプログラムを、GitHubに上げておきました。
ただの読み書きでは面白くないとおもい、簡単なスライドショーアプリを作ってみたのですが、かえってコードが見づらくなったような気がします。
読み書きしている部分は、MainWindowクラスのopen()とsave()、それからPlaylistクラスとSlideshowSettingクラスのreadFromJson()とwriteToJson()です。
#おわりに
今回は、単純なデータをJSON形式でサクッと書き出してみました。
今後は、圧縮した画像も一緒に保存する、なんてこともやりたいです。