Qtの基礎 - JSON

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

QJsonDocumentクラスは、JSONドキュメントをラップするクラスである。
UTF-8でエンコードされたテキストベースの表現からJSONファイルを読み書きすることができる。

JSONファイルは、QJsonDocumentクラスのfromJsonメソッドを使用して、QJsonDocumentクラスに変換することができる。
JSONパーサーは高速で効率的であり、JSONをQtが使用するバイナリ表現に変換する。

解析されたJSONファイルの有効性は、isNullメソッドで照会することができる。

また、isArrayメソッドおよびisObjectメソッドを使用して、JSONファイルに配列やオブジェクトが含まれているかどうかを調べることができる。
JSONファイルに含まれる配列やオブジェクトをarrayメソッド、objectメソッドで取得して操作するしたりすることも可能である。


JSONの注意点

JSONの詳細を知りたい場合は、RFC 8259を参照すること。

文字のエスケープ

文字列の中でダブルクォーテーション、バックスラッシュを文字として扱う場合、\ (バックスラッシュ) を使用してエスケープする必要がある。

 #  : <u>key</u>に<u>\hello "world"\</u>という文字列を入力する場合
 
 {"key" : "\\hello \"world\"\\"}


数値は10進数のみ扱うことができる

数値において、2進数、8進数、16進数を使用することはできない。

 # 間違った例 :
 
 {
    "value1" : 0xF0,
    "value2" : 070
 }



Jsonファイルの読み込み

 # Sample.json
 
 {
    "appDesc": {
       "description": "SomeDescription",
       "message": "SomeMessage"
    },
 
    "appName": {
       "description": "Home",
       "message": "Welcome",
       "imp":["awesome","best","good"]
    }
 }


  • CMakeを使用する場合
 # Qt 5の場合
 find_package(Qt5 REQUIRED COMPONENTS Core)
 target_link_libraries(<プロジェクト名> PRIVATE Qt5::Core)
 
 # Qt 6の場合
 find_package(Qt6 REQUIRED COMPONENTS Core)
 target_link_libraries(<プロジェクト名> PRIVATE Qt6::Core)


  • QMakeを使用する場合
 QT += core


 #include <vector>
 #include <QJsonDocument>
 
 void readJson()
 {
    // Jsonファイルの読み込み
    QFile file("Sample.json");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
 
    // valueの内容 : QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) )
    QString value = file.readAll();
 
    file.close();
 
    QJsonDocument doc = QJsonDocument::fromJson(value.toUtf8());
    QJsonObject sett2 = doc.object();
 
    // appvalueの内容 : QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
    QJsonValue appvalue = sett2.value(QString("appName"));
 
    // itemの内容 : QJsonValue(string, "Home") 
    QJsonObject item = appvalue.toObject();
 
    // Jsonの値が文字列の場合、値を文字列に変換する
    QString subobj = item["description"].toString();
 
    // Jsonの値が配列の場合、配列を文字列に変換する
    QJsonArray impvalues = item["imp"].toArray();
 
    QString impvalue2 = impvalues[2].toString();  // 要素を指定して取得する場合
 
    std::vector<QString> vecvalues = {};
    for (const auto impvalue : impvalues) {       // 範囲ループforで取得する場合
       vecvalues.push_back(impvalue.toString());
    }
 }