MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - JSONのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - JSON
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <code>QJsonDocument</code>クラスは、JSONドキュメントをラップするクラスである。<br> UTF-8でエンコードされたテキストベースの表現からJSONファイルを読み書きすることができる。<br> <br> JSONファイルは、<code>QJsonDocument</code>クラスの<code>fromJson</code>メソッドを使用して、<code>QJsonDocument</code>クラスに変換することができる。<br> JSONパーサーは高速で効率的であり、JSONをQtが使用するバイナリ表現に変換する。<br> <br> 解析されたJSONファイルの有効性は、<code>isNull</code>メソッドで照会することができる。<br> <br> また、<code>isArray</code>メソッドおよび<code>isObject</code>メソッドを使用して、JSONファイルに配列やオブジェクトが含まれているかどうかを調べることができる。<br> JSONファイルに含まれる配列やオブジェクトを<code>array</code>メソッド、<code>object</code>メソッドで取得して操作するしたりすることも可能である。<br> <br><br> == JSONの注意点 == JSONの詳細を知りたい場合は、[https://www.rfc-editor.org/rfc/rfc8259 RFC 8259]を参照すること。<br> <br> ==== 文字のエスケープ ==== 文字列の中でダブルクォーテーション、バックスラッシュを文字として扱う場合、<code>\</code> (バックスラッシュ) を使用してエスケープする必要がある。<br> <syntaxhighlight lang="json"> # 例 : keyに\Sample "Word"\という文字列を入力する場合 { "key" : "\\Sample \"Word\"\\" } </syntaxhighlight> <br> ==== 数値は10進数のみ扱うことができる ==== 数値において、2進数、8進数、16進数を使用することはできない。<br> <syntaxhighlight lang="json"> # 間違った例 : { "value1" : 0xF0, "value2" : 070 } </syntaxhighlight> <br><br> == Jsonファイルの読み込み == <syntaxhighlight lang="json"> # Sample.json { "appDesc": { "description": "SomeDescription", "message": "SomeMessage" }, "appName": { "description": "Home", "message": "Welcome", "imp":["awesome","best","good"] } } </syntaxhighlight> <br> * CMakeを使用する場合 <syntaxhighlight lang="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) </syntaxhighlight> <br> * QMakeを使用する場合 <syntaxhighlight lang="make"> QT += core </syntaxhighlight> <br> <syntaxhighlight lang="c++"> #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()); } } </syntaxhighlight> <br><br> == JSONファイルの作成 == JSONファイルを作成する場合、以下に示す手順に従う。<br> # まず、QJsonObjectクラスを使用して、JSONオブジェクトを作成する。 # 配列の場合は、QJsonArrayクラスを使用してJSON配列を作成した後、それをオブジェクトに追加する。 # QJsonDocumentクラスを使用してJSONドキュメントを作成した後、それをファイルに書き込む。 <br> 以下の例では、指定されたJSON構造を持つSample.jsonファイルを生成している。<br> <br> <code>QJsonDocument</code>クラスの<code>toJson</code>メソッドは、整形されていないJSONデータを返す。<br> 読みやすい形式で出力する場合は、<code>toJson(QJsonDocument::Indented)</code>メソッドを使用すること。<br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QException> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // JSONオブジェクトの作成 QJsonObject jsonObject; jsonObject["description"] = "Home"; // JSON配列を定義して値を追加する QJsonArray impArray; impArray.append("awesome"); impArray.append("best"); impArray.append("good"); // 配列をオブジェクトに追加 jsonObject["imp"] = impArray; // 別のキーと値を追加 jsonObject["message"] = "YouTube"; // JSONドキュメントを作成 QJsonDocument jsonDocument(jsonObject); try { // JSONファイルを作成 QFile file("Sample.json"); if (!file.open(QIODevice::WriteOnly)) { qWarning("ファイルを開けませんでした。"); return -1; } file.write(jsonDocument.toJson()); file.close(); } catch (QException &ex) { qWarning("Could not create json file : " + ex.what()); return -1; } return a.exec(); } </syntaxhighlight> <br> 以下に示すようなJSONファイルが作成される。<br> <syntaxhighlight lang="json"> # Sample.json { "appDesc": { "description": "SomeDescription", "message": "SomeMessage" }, "appName": { "description": "Home", "message": "Welcome", "imp":["awesome","best","good"] } } </syntaxhighlight> <br><br> == JSONファイルの編集 == 以下に示すようなJSONファイルにおいて、<u>appDesc</u>オブジェクトにある<u>description</u>キーの値を変更する。<br> <syntaxhighlight lang="json"> # Sample.json { "appDesc": { "description": "SomeDescription", "message": "SomeMessage" }, "appName": { "description": "Home", "message": "Welcome", "imp":["awesome","best","good"] } } </syntaxhighlight> <br> JSONファイルを編集する場合、以下に示す手順に従う。<br> # <code>QFile</code>クラスを使用して、JSONファイルを読み込む。 # <code>QJsonDocument</code>クラスを使用して読み込んだデータを解析して、JSONオブジェクトに変換する。 # <code>QJsonObject</code>クラスでdescriptionキーの値を変更する。 # <code>QJsonDocument</code>クラスを使用して変更したJSONオブジェクトから新しいJSONドキュメントを作成して、それをファイルに書き込む。 <br> 以下の例では、Sample.jsonファイルからJSONデータを読み込み、appDesc内のdescriptionキーの値をhogeに変更して、同じファイルに変更を保存している。<br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QException> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Sample.josnファイルを開く QFile file("Sample.json"); if (!file.open(QIODevice::ReadOnly)) { qWarning("Could not open json file."); return -1; } try { // Sample.jsonファイルからJSONデータを読み込む QByteArray jsonData = file.readAll(); } catch (QException &ex) { qWarning("Could not read json file."); file.close(); return -1; } file.close(); // JSONドキュメントを解析 QJsonDocument document = QJsonDocument::fromJson(jsonData); QJsonObject rootObject = document.object(); // appDescオブジェクトを取得して、descriptionキーの値を変更 QJsonObject appDescObject = rootObject["appDesc"].toObject(); appDescObject["description"] = "hoge"; // descriptionキーの値を変更 // 変更したappDescオブジェクトをrootオブジェクトに格納 rootObject["appDesc"] = appDescObject; // 変更したappDescオブジェクトでJSONドキュメントを更新 QJsonDocument updatedDocument(rootObject); // ファイルに書き出し if (!file.open(QIODevice::WriteOnly)) { qWarning("ファイルを再度開けませんでした。"); return -1; } try { file.write(updatedDocument.toJson()); } catch (QException &ex) { qWarning("Could not modify json file."); file.close(); return -1; } file.close(); return a.exec(); } </syntaxhighlight> <br><br> == JSONファイルのオブジェクトの削除 == 以下に示すようなJSONファイルにおいて、各オブジェクトから<u>fuga</u>キーの値がffのオブジェクトを削除する。<br> <syntaxhighlight lang="json"> [ { "hoge": "aa", "piyo": "bb", "fuga": "cc" }, { { "hoge": "dd", "piyo": "ee", "fuga": "ff" }, { "hoge": "gg", "piyo": "hh", "fuga": "ii" } ] </syntaxhighlight> <br> JSONファイルの任意のオブジェクトを削除する場合、以下に示す手順に従う。<br> # JSONファイルの読み込み #: <code>QFile</code>クラスおよび<code>QJsonDocument</code>クラスを使用して、JSONファイルを読み込む。 # "fuga"キーの値の確認 #: <code>QJsonDocument</code>クラスを使用して読み込んだデータを解析する。 #: 各オブジェクトの"fuga"キーの値を確認して、値が"ff"と一致するものを特定する。 # 条件に一致するオブジェクトの削除 #: 条件に一致するオブジェクトを配列から削除する。 # 変更をファイルに保存 #: 変更後のJSONデータをファイルに再保存する。 <br> 以下の例では、JSONファイルからデータを読み込み、各オブジェクトにあるfugaキーの値がffのオブジェクトを削除して、その結果を元のファイルに上書き保存している。<br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QFile> #include <QJsonDocument> #include <QJsonArray> #include <QJsonObject> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFile file("/path/to/your/jsonfile.json"); if (!file.open(QIODevice::ReadOnly)) { qWarning("ファイルを開けませんでした。"); return -1; } QByteArray data = file.readAll(); QJsonDocument doc(QJsonDocument::fromJson(data)); QJsonArray array = doc.array(); // "fuga"キーの値が"ff"のオブジェクトを削除する QJsonArray newArray; QString targetfugaStr = "ff"; for (int i = 0; i < array.size(); ++i) { QJsonObject obj = array[i].toObject(); QString fugaString = obj["fuga"].toString() if (targetfugaStr != targetDate) { newArray.append(obj); } } // 変更をファイルに保存 QJsonDocument saveDoc(newArray); if (!file.open(QIODevice::WriteOnly)) { qWarning("ファイルを書き込みモードで開けませんでした"); return -1; } try { file.write(saveDoc.toJson()); } catch (QException &ex) { qWarning("JSONファイルの保存に失敗しました"); file.close(); return -1; } file.close(); return a.exec(); } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - JSON
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse