web-dev-qa-db-ja.com

Qt5でJSonファイルを作成/読み取り/書き込みする方法

Qt5には新しいJSonパーサーがあり、それを使用したいと思います。問題は、関数が素人の言葉で何をするか、そしてそれを使ってコードを書く方法についてあまり明確ではないということです。それまたは私はそれを間違って読んでいる可能性があります。

Qt5でJsonファイルを作成するコードと、「カプセル化」の意味を知りたいです。

55
Jim Kieger

例:ファイルからjsonを読み取る

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


void readJson()
   {
      QString val;
      QFile file;
      file.setFileName("test.json");
      file.open(QIODevice::ReadOnly | QIODevice::Text);
      val = file.readAll();
      file.close();
      qWarning() << val;
      QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
      QJsonObject sett2 = d.object();
      QJsonValue value = sett2.value(QString("appName"));
      qWarning() << value;
      QJsonObject item = value.toObject();
      qWarning() << tr("QJsonObject of description: ") << item;

      /* in case of string value get value and convert into string*/
      qWarning() << tr("QJsonObject[appName] of description: ") << item["description"];
      QJsonValue subobj = item["description"];
      qWarning() << subobj.toString();

      /* in case of array get array and convert into string*/
      qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"];
      QJsonArray test = item["imp"].toArray();
      qWarning() << test[1].toString();
   }

出力

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) ) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) ) 
"best" 

例:文字列からjsonを読み取る

以下のようにjsonを文字列に割り当て、前に示したreadJson()関数を使用します。

val =   
'  {
       "appDesc": {
          "description": "SomeDescription",
          "message": "SomeMessage"
       },
       "appName": {
          "description": "Home",
          "message": "Welcome",
          "imp":["awesome","best","good"]
       }
    }';

出力

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) ) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) ) 
"best" 
91

悲しいことに、多くのJSON C++ライブラリには使用するのが簡単なAPIがありますが、JSONは使いやすいように設計されています。

だから私は jsoncpp から gSOAP tools を上記の回答の1つに示されているJSONドキュメントで試しました。これはC++でJSONオブジェクトを構築するためにjsoncppで生成されたコードです次に、JSON形式でstd :: cout:に書き込まれます。

value x(ctx);
x["appDesc"]["description"] = "SomeDescription";
x["appDesc"]["message"] = "SomeMessage";
x["appName"]["description"] = "Home";
x["appName"]["message"] = "Welcome";
x["appName"]["imp"][0] = "awesome";
x["appName"]["imp"][1] = "best";
x["appName"]["imp"][2] = "good";
std::cout << x << std::endl;

これは、std :: cinからJSONを解析してその値を抽出するためにjsoncppによって生成されたコードです(必要に応じてUSE_VALを置き換えます)。

value x(ctx);
std::cin >> x;
if (x.soap->error)
  exit(EXIT_FAILURE); // error parsing JSON
#define USE_VAL(path, val) std::cout << path << " = " << val << std::endl
if (x.has("appDesc"))
{
  if (x["appDesc"].has("description"))
    USE_VAL("$.appDesc.description", x["appDesc"]["description"]);
  if (x["appDesc"].has("message"))
    USE_VAL("$.appDesc.message", x["appDesc"]["message"]);
}
if (x.has("appName"))
{
  if (x["appName"].has("description"))
    USE_VAL("$.appName.description", x["appName"]["description"]);
  if (x["appName"].has("message"))
    USE_VAL("$.appName.message", x["appName"]["message"]);
  if (x["appName"].has("imp"))
  {
    for (int i2 = 0; i2 < x["appName"]["imp"].size(); i2++)
      USE_VAL("$.appName.imp[]", x["appName"]["imp"][i2]);
  }
}

このコードは、gSOAP 2.8.28のJSON C++ APIを使用します。私は人々がライブラリを変更することを期待していませんが、この比較はJSON C++ライブラリを視野に入れるのに役立つと思います。

2
Dr. Alex RE

それを使用する方法の例は素晴らしいでしょう。 Qtフォーラム にはいくつかの例がありますが、公式ドキュメントを拡張する必要があることは正しいです。

QJsonDocument自体は実際には何も生成しません。データを追加する必要があります。これは、QJsonObjectQJsonArray、およびQJsonValueクラスを介して行われます。最上位のアイテムは配列またはオブジェクトである必要があります(1は有効なjsonドキュメントではありませんが、{foo: 1}は有効です。)

0
Jan Kundrát