Edited at

QJsonDocumentとQJsonObjectを使って、JSON形式で読み書きする方法

More than 1 year has passed since last update.


はじめに

自作アプリの設定を、JSON形式で読み書きしたいと思い、その方法を調べたのでまとめます。


JSON形式で保存するまでの流れ



  1. QJsonObjectのインスタンスを作成

    QJsonObject jsonObj;
    



  2. 1で作成したインスタンスにデータを記録

    // インスタンス[キー] = 値;
    
    jsonObj["name"] = m_userName;

    配列を記録したいときは、QJsonArrayのインスタンスを作成し、それを代入します。

    QJsonArray jsonArr;

    for (auto name : m_nameList)
    {
    jsonArr.append(name);
    }

    jsonObj["nameList"] = jsonArr;




  3. QJsonObjectから、QJsonDocumentインスタンスを作成

    QJsonDocument jsonDoc(jsonObj);
    



  4. QJsonDocumentインスタンスからQByteArrayを取得

    // JSON形式
    
    QByteArray data(jsonDoc.toJson());

    バイナリ形式で書き出す場合はtoBinaryData()を使います

    // バイナリ形式
    
    QByteArray data(jsonDoc.toBinaryData());



  5. ファイルオブジェクトに書き込む

    QFile saveFile(filename);
    
    saveFile.open(QIODevice::WriteOnly);
    saveFile.write(data);
    saveFile.close();



JSON形式のデータを読み込むまでの流れ



  1. データをバイト列として読み込む

    QFile openFile(QIODevice::ReadOnly);
    
    QByteArray data = openFile.readAll();



  2. 読み込んだデータから、QJsonDocumentを作成する

    // JSON形式で書き出されたファイルを読み込む時
    
    QJsonDocument jsonDoc(QJsonDocument::fromJson(data));

    バイナリ形式で書き出されたファイルを読む場合は、fromBinaryDataを使います

    // バイナリ形式で書き出されたファイルを読み込む時
    
    QJsonDocument jsonDoc(QJsonDocument::fromBinaryData(data));



  3. QJsonDocument::object()を使って、QJsonObjectを取得する

    QJsonObject jsonObj(jsonDoc.object());
    



  4. 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()です。

GitHub - SimpleSlideShow


おわりに

今回は、単純なデータをJSON形式でサクッと書き出してみました。

今後は、圧縮した画像も一緒に保存する、なんてこともやりたいです。