Qtの基礎 - JSON
ナビゲーションに移動
検索に移動
概要
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());
}
}