Разбор вложенных JSON с QJsonDocument в Qt

Мне интересно посмотреть, как мы можем использовать 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();

1

Решение

Я не уверен, что вы спрашиваете, но, возможно, это может помочь:

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"
4

Другие решения

В нотации 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"}

Итак, теперь вы должны иметь возможность делать то, что вы хотите. 🙂

2

По вопросам рекламы [email protected]