Qt 使用 QJsonDocument、QJsonObject、QJsonArray 解析 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19822211/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Qt parsing JSON using QJsonDocument, QJsonObject, QJsonArray
提问by Jared Price
I'm using Qt5. I am trying to obtain values from a json object. Here is what the json object looks like that I am trying to get data from:
我正在使用 Qt5。我正在尝试从 json 对象获取值。这是我试图从中获取数据的 json 对象的样子:
{
"success": true,
"properties": [
{
"ID": 1001,
"PropertyName": "McDonalds",
"key": "00112233445566778899aabbccddeeff"
},
{
"ID": 1002,
"PropertyName": "Burger King",
"key": "10112233445566778899aabbccddeeff"
},
{
"ID": 1003,
"PropertyName": "Taco Bell",
"key": "20112233445566778899aabbccddeeff"
}
]
}
How can I create three arrays that contain properties[x].ID, properties[x].PropertyName, and properties[x].keyin Qt?
我怎样才能创建一个包含三个阵列properties[x].ID,properties[x].PropertyName和properties[x].keyQt中?
Edit:
编辑:
Using QScriptEngineI tried this:
使用QScriptEngine我试过这个:
QString data = (QString)reply->readAll();
QScriptEngine engine;
QScriptValue result = engine.evaluate(data);
qDebug() << result.toString();
Debug is saying "SyntaxError: Parse error"
调试说“语法错误:解析错误”
回答by Jared Price
I figured it out:
我想到了:
QStringList propertyNames;
QStringList propertyKeys;
QString strReply = (QString)reply->readAll();
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonObject jsonObject = jsonResponse.object();
QJsonArray jsonArray = jsonObject["properties"].toArray();
foreach (const QJsonValue & value, jsonArray) {
QJsonObject obj = value.toObject();
propertyNames.append(obj["PropertyName"].toString());
propertyKeys.append(obj["key"].toString());
}
回答by alanwsx
Here is an example from How To Manipulate JSON With C++ and Qt.
这是如何使用 C++ 和 Qt 操作 JSON的示例 。
// reads a json file from disk to QVariantMap
// originally from http://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html
bool readJsonFile(std::string file_path, QVariantMap& result)
{
// step 1
QFile file_obj(QString::fromStdString(file_path));
if (!file_obj.open(QIODevice::ReadOnly)) {
std::cout << "Failed to open " << file_path << std::endl;
exit(1);
}
// step 2
QTextStream file_text(&file_obj);
QString json_string;
json_string = file_text.readAll();
file_obj.close();
QByteArray json_bytes = json_string.toLocal8Bit();
// step 3
auto json_doc = QJsonDocument::fromJson(json_bytes);
if (json_doc.isNull()) {
std::cout << "Failed to create JSON doc." << std::endl;
return false;
}
if (!json_doc.isObject()) {
std::cout << "JSON is not an object." << std::endl;
return false;
}
QJsonObject json_obj = json_doc.object();
if (json_obj.isEmpty()) {
std::cout << "JSON object is empty." << std::endl;
return false;
}
// step 4
result = json_obj.toVariantMap();
return true;
}
// writes a QVariantMap to disk
bool writeJsonFile(QVariantMap point_map, std::string file_path)
{
QJsonObject json_obj = QJsonObject::fromVariantMap(point_map);
QJsonDocument json_doc(json_obj);
QString json_string = json_doc.toJson();
QFile save_file(QString::fromStdString(file_path));
if (!save_file.open(QIODevice::WriteOnly)) {
std::cout << "failed to open save file" << std::endl;
return false;
}
save_file.write(json_string.toLocal8Bit());
save_file.close();
return true;
}

