Мне интересно посмотреть, как мы можем использовать Qt’s QJsonDocument в разбор все записи из простого вложенный JSON (поскольку я только начал изучать это).
Пример вложенного 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 все должно быть отформатировано в ключ-значение. Ключи всегда строки, но ценности могут быть строковыми литералами ("example"
), числовые литералы, массивы ([]
) и объекты ({}
).
QJsonDocument::fromJson(...).object()
возвращает корневой объект заданной строки JSON. Напомним, что объекты написаны {}
нотации. Этот метод дает вам QJsonObject
, Это JSON объект имеет 3 ключи ("city"
, "name"
а также "unit_data"
) который значение из этих ключей имеют строковый литерал, строковый литерал и массив соответственно.
Поэтому, если вы хотите получить доступ к данным, хранящимся в этом массиве, вы должны сделать:
QJsonArray array = rootObj["unit_data"].toArray();
Обратите внимание, что массивы не имеют ключи, у них есть только ценности который может быть из трех типов, упомянутых выше. В этом случае массив содержит 2 объекты которые можно рассматривать как другие объекты JSON. Так,
QJsonObject obj = array.at(0).toObject();
Теперь obj
объект указывает на следующий объект:
{
"unit_data_id": "ABC123",
"unit_data_number": "21"}
Итак, теперь вы должны иметь возможность делать то, что вы хотите. 🙂