LoginSignup
8
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-02

はじめに

自作アプリの設定を、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形式でサクッと書き出してみました。
今後は、圧縮した画像も一緒に保存する、なんてこともやりたいです。

8
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6