2016-09-16 5 views
1

Я заинтересован в том, как мы можем использовать QJsonDocument для синтаксического анализа записи Qt от простого вложенного JSON (как я только начал изучать это).Анализировать вложенную JSON с QJsonDocument в Qt

вложенная 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(); 

ответ

3

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

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" 
+0

Быстрый вопрос о последующих действиях: как мы можем проверить/убедиться, что '' QJsonArray' array.at (i) 'не будет выходить за пределы диапазона, т. Е. Для' i> = 2' в примере выше? –

+0

@ nk-fford Вы можете получить размер QJsonArray, используя функцию [QJsonArray :: count()] (http://doc.qt.io/Qt-5/qjsonarray.html#count). Диапазон, показанный в ответе, не должен выходить за пределы допустимого диапазона. –

2

В обозначениях 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" 
} 

Итак, теперь вы должны быть в состоянии сделать то, что вы хотите. :)

 Смежные вопросы

  • Нет связанных вопросов^_^