在 Qt 中用 QJsonDocument 解析嵌套 JSON
Parse nested JSON with QJsonDocument in Qt
我有兴趣了解如何使用 Qt 的 QJsonDocument 来 解析 来自简单 嵌套 JSON[= 的所有条目23=](因为我刚开始研究这个)。
嵌套 json 示例:
{
"city": "London",
"time": "16:42",
"unit_data":
[
{
"unit_data_id": "ABC123",
"unit_data_number": "21"
},
{
"unit_data_id": "DEF456",
"unit_data_number": "12"
}
]
}
我可以像这样解析它的非嵌套部分:
QJsonObject jObj;
QString city = jObj["city"].toString();
QString time = jObj["time"].toString();
我不确定你在问什么,但也许这可能会有所帮助:
QJsonDocument doc;
doc = QJsonDocument::fromJson("{ "
" \"city\": \"London\", "
" \"time\": \"16:42\", "
" \"unit_data\": "
" [ "
" { "
" \"unit_data_id\": \"ABC123\", "
" \"unit_data_number\": \"21\" "
" }, "
" { "
" \"unit_data_id\": \"DEF456\", "
" \"unit_data_number\": \"12\" "
" } "
" ] "
" }");
// This part you have covered
QJsonObject jObj = doc.object();
qDebug() << "city" << jObj["city"].toString();
qDebug() << "time" << jObj["time"].toString();
// Since unit_data is an array, you need to get it as such
QJsonArray array = jObj["unit_data"].toArray();
// Then you can manually access the elements in the array
QJsonObject ar1 = array.at(0).toObject();
qDebug() << "" << ar1["unit_data_id"].toString();
// Or you can loop over the items in the array
int idx = 0;
for(const QJsonValue& val: array) {
QJsonObject loopObj = val.toObject();
qDebug() << "[" << idx << "] unit_data_id : " << loopObj["unit_data_id"].toString();
qDebug() << "[" << idx << "] unit_data_number: " << loopObj["unit_data_number"].toString();
++idx;
}
我得到的输出是:
city "London"
time "16:42"
"ABC123"
[ 0 ] unit_data_id : "ABC123"
[ 0 ] unit_data_number: "21"
[ 1 ] unit_data_id : "DEF456"
[ 1 ] unit_data_number: "12"
在JSON 表示法中,所有内容都应采用键值格式。 Keys 始终是字符串,但 values 可以是字符串文字 ("example"
)、数字文字、数组 ([]
)和对象 ({}
).
QJsonDocument::fromJson(...).object()
returns 给定 JSON 字符串的 根对象 。回想一下,对象是用 {}
表示法编写的。这个方法给你一个QJsonObject
。这个 JSON object 有 3 个 keys ("city"
, "name"
and "unit_data"
) 这些键的值分别是字符串字面量、字符串字面量和数组类型
因此,如果您想访问存储在该数组中的数据,您应该这样做:
QJsonArray array = rootObj["unit_data"].toArray();
请注意,数组没有 keys,它们只有 values,这可能是上述三种类型。在这种情况下,该数组包含 2 个 对象 ,可以将其视为其他 JSON 对象。所以,
QJsonObject obj = array.at(0).toObject();
现在 obj
对象指向以下对象:
{
"unit_data_id": "ABC123",
"unit_data_number": "21"
}
所以,您现在应该可以做您想做的事了。 :)
您的 JSON 中的某个元素可能包含更多元素。也可能是你不知道文件的特性(或者你想有一个通用的功能)。
因此您可以对任何 JSON 使用函数:
void traversJson(QJsonObject json_obj){
foreach(const QString& key, json_obj.keys()) {
QJsonValue value = json_obj.value(key);
if(!value.isObject() ){
qDebug() << "Key = " << key << ", Value = " << value;
}
else{
qDebug() << "Nested Key = " << key;
traversJson(value.toObject());
}
}
};
我有兴趣了解如何使用 Qt 的 QJsonDocument 来 解析 来自简单 嵌套 JSON[= 的所有条目23=](因为我刚开始研究这个)。
嵌套 json 示例:
{
"city": "London",
"time": "16:42",
"unit_data":
[
{
"unit_data_id": "ABC123",
"unit_data_number": "21"
},
{
"unit_data_id": "DEF456",
"unit_data_number": "12"
}
]
}
我可以像这样解析它的非嵌套部分:
QJsonObject jObj;
QString city = jObj["city"].toString();
QString time = jObj["time"].toString();
我不确定你在问什么,但也许这可能会有所帮助:
QJsonDocument doc;
doc = QJsonDocument::fromJson("{ "
" \"city\": \"London\", "
" \"time\": \"16:42\", "
" \"unit_data\": "
" [ "
" { "
" \"unit_data_id\": \"ABC123\", "
" \"unit_data_number\": \"21\" "
" }, "
" { "
" \"unit_data_id\": \"DEF456\", "
" \"unit_data_number\": \"12\" "
" } "
" ] "
" }");
// This part you have covered
QJsonObject jObj = doc.object();
qDebug() << "city" << jObj["city"].toString();
qDebug() << "time" << jObj["time"].toString();
// Since unit_data is an array, you need to get it as such
QJsonArray array = jObj["unit_data"].toArray();
// Then you can manually access the elements in the array
QJsonObject ar1 = array.at(0).toObject();
qDebug() << "" << ar1["unit_data_id"].toString();
// Or you can loop over the items in the array
int idx = 0;
for(const QJsonValue& val: array) {
QJsonObject loopObj = val.toObject();
qDebug() << "[" << idx << "] unit_data_id : " << loopObj["unit_data_id"].toString();
qDebug() << "[" << idx << "] unit_data_number: " << loopObj["unit_data_number"].toString();
++idx;
}
我得到的输出是:
city "London"
time "16:42"
"ABC123"
[ 0 ] unit_data_id : "ABC123"
[ 0 ] unit_data_number: "21"
[ 1 ] unit_data_id : "DEF456"
[ 1 ] unit_data_number: "12"
在JSON 表示法中,所有内容都应采用键值格式。 Keys 始终是字符串,但 values 可以是字符串文字 ("example"
)、数字文字、数组 ([]
)和对象 ({}
).
QJsonDocument::fromJson(...).object()
returns 给定 JSON 字符串的 根对象 。回想一下,对象是用 {}
表示法编写的。这个方法给你一个QJsonObject
。这个 JSON object 有 3 个 keys ("city"
, "name"
and "unit_data"
) 这些键的值分别是字符串字面量、字符串字面量和数组类型
因此,如果您想访问存储在该数组中的数据,您应该这样做:
QJsonArray array = rootObj["unit_data"].toArray();
请注意,数组没有 keys,它们只有 values,这可能是上述三种类型。在这种情况下,该数组包含 2 个 对象 ,可以将其视为其他 JSON 对象。所以,
QJsonObject obj = array.at(0).toObject();
现在 obj
对象指向以下对象:
{
"unit_data_id": "ABC123",
"unit_data_number": "21"
}
所以,您现在应该可以做您想做的事了。 :)
您的 JSON 中的某个元素可能包含更多元素。也可能是你不知道文件的特性(或者你想有一个通用的功能)。
因此您可以对任何 JSON 使用函数:
void traversJson(QJsonObject json_obj){
foreach(const QString& key, json_obj.keys()) {
QJsonValue value = json_obj.value(key);
if(!value.isObject() ){
qDebug() << "Key = " << key << ", Value = " << value;
}
else{
qDebug() << "Nested Key = " << key;
traversJson(value.toObject());
}
}
};