📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の12版が非表示)
12行目: 12行目:
<br><br>
<br><br>


== Jsonファイルの読み込み ==
== 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">
  <syntaxhighlight lang="json">
  # Sample.json
  # Sample.json
82行目: 109行目:
       vecvalues.push_back(impvalue.toString());
       vecvalues.push_back(impvalue.toString());
     }
     }
}
</syntaxhighlight>
<br>
==== 配列オブジェクトの場合 ====
<syntaxhighlight lang="json">
# Sample.json
{
    {
      "description": "SomeDescription",
      "message": "SomeMessage"
    },
    {
      "description": "Home",
      "message": "Welcome",
      "imp":["awesome","best","good"]
    }
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QString>
#include <QDebug>
void readJson()
{
    // Jsonファイルの読み込み
    QFile file("Sample.json");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "JSONファイルの読み込みに失敗しました" << filePath;
        return;
    }
    QByteArray jsonData = file.readAll();
    // ファイルを閉じる
    file.close();
    QJsonDocument document = QJsonDocument::fromJson(jsonData);
    if (!document.isArray()) {
      qDebug() << "JSONファイルに配列オブジェクトがありません";
      return;
    }
    QJsonArray jsonArray = document.array();
    foreach (const QJsonValue &value, jsonArray) {
      QJsonObject obj = value.toObject();
      QString desc    = obj["description"].toString();
      QString message = obj["message"].toString();
      // キーの値が配列の場合、配列を文字列に変換する
      QJsonArray impvalues = obj["imp"].toArray();
      // 配列から要素を指定して取得する場合
      QString impvalue1 = impvalues[1].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>
  </syntaxhighlight>
<br><br>
<br><br>


{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]