Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt5中创建/读取/写入JSON文件_C++_Json_Qt_Qt5 - Fatal编程技术网

C++ 如何在Qt5中创建/读取/写入JSON文件

C++ 如何在Qt5中创建/读取/写入JSON文件,c++,json,qt,qt5,C++,Json,Qt,Qt5,Qt5有一个新的JSON解析器,我想使用它。问题是,用外行的话说,函数做什么以及如何用它编写代码还不是很清楚。否则我可能看错了 我想知道在Qt5中创建JSON文件的代码以及“封装”的含义。关于如何使用该文件的示例将非常有用。下面有几个例子,但您认为官方文档应该扩展是对的 QJsonDocument本身确实不会产生任何结果,您必须将数据添加到其中。这是通过QJsonObject、QJsonArray和QJsonValue类完成的。顶级项需要是数组或对象(因为1不是有效的json文档,而{foo:1

Qt5有一个新的JSON解析器,我想使用它。问题是,用外行的话说,函数做什么以及如何用它编写代码还不是很清楚。否则我可能看错了


我想知道在Qt5中创建JSON文件的代码以及“封装”的含义。

关于如何使用该文件的示例将非常有用。下面有几个例子,但您认为官方文档应该扩展是对的


QJsonDocument
本身确实不会产生任何结果,您必须将数据添加到其中。这是通过
QJsonObject
QJsonArray
QJsonValue
类完成的。顶级项需要是数组或对象(因为
1
不是有效的json文档,而
{foo:1}
是有效的json文档)。

示例:从文件读取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();
   }


示例:从字符串读取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" 
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 C++库都有API,这些API是不可使用的,而JSON则是易于使用的。

我从上面的一个答案中所示的JSON DOC上尝试了这是用JSONCPP生成的C++中构造JSON对象的代码,然后用JSON格式编写成STD::CUT:< /P>

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;

此代码使用GSOAP 2.828的JSON C++ API。我不希望人们改变库,但我认为这种比较有助于将JSON C++库放在透视图中。

Min Lin:QJson与QT5(不确定它甚至是移植的)有点过时了,因为它带来了自己的JSON实现。吉姆:你试过什么?具有QJsonDocument::QJsonDocument()和QJsonDocument::QJsonDocument(const QJsonDocument&other)函数。我尝试过QJsonDocument,但它似乎没有产生任何效果。在研究了这一点之后,我认为我将继续使用QSettings,而不是在某些事情上使用JSon。谢谢你的帮助。我发现这个非常好的例子是一颗闪亮的希望之星,我一直在不折不扣地遵循这个例子。但是,当我调试该示例时,条目的值显示为null。这是关于如何在QT中创建、读取和写入JSON文件的“一步一步”的唯一示例吗?我不知道我可能做错了什么。使用QT Creator 3.0.1。Thanks@Shawn在QT Creator的帮助选项卡中,搜索JSON保存游戏示例。这几乎演示了读取和写入JSON值(包括数组)所需的所有操作。如果改用
QByteArray
,您可以跳过将utf-8字节转换为utf-16并返回(QString,
toUtf8()
),将整个文件加载到字符串,然后解析字符串,真的吗?!在检查可选的错误参数之前,我一直对此有问题:
QJsonParseError;QByteArray utf8String=jsonString.toUtf8();QJsonDocument d=QJsonDocument::fromJson(utf8String,&err)
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]);
  }
}