如何在Qt5中创build/读取/写入JSon文件
Qt5有一个新的JSonparsing器,我想使用它。 问题在于function在外行的用语以及如何编写代码并不太清楚。 这或我可能会读错了。
我想知道在Qt5中创buildJson文件的代码以及“封装”的含义。
例如:从文件读取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(); }
OUTPUT
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"
示例:从string中读取json
将json分配给string如下,并使用readJson()
显示的readJson()
函数:
val = ' { "appDesc": { "description": "SomeDescription", "message": "SomeMessage" }, "appName": { "description": "Home", "message": "Welcome", "imp":["awesome","best","good"] } }';
OUTPUT
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使用起来并不平凡,而JSON旨在易于使用。
所以我尝试从上面的答案中显示的JSON文档上的gSOAP工具jsoncpp ,这是用jsoncpp生成的代码构build一个JSON对象,然后用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;
这是由jsoncpp从std :: cinparsingJSON并提取其值(根据需要replaceUSE_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 ++图书馆放在眼里。
如何使用这个例子会很好。 在Qt论坛有几个例子,但是你说的正确的文档应该被扩展。
QJsonDocument
本身确实不会产生任何东西,您将不得不将数据添加到它。 这是通过QJsonObject
, QJsonArray
和QJsonValue
类完成的。 顶级项目需要是数组或对象(因为1
不是有效的json文档,而{foo: 1}
是)。