Проверьте, является ли это QJsonObject или QJsonArray в Qt - PullRequest
0 голосов
/ 01 октября 2018

Я должен получить QJsonObject с сервера, который будет содержать QJsonObject или QJsonArray с именем «Список».Я имею в виду, «Список» может быть либо QJsonObject, либо QJsonArray.Так как проверить, является ли «Список» QJsonObject или QJsonArray?

Полученный QJsonDocument может быть одним из двух нижеуказанных форматов записи

1) Здесь «Список»"это QJsonArray

{
  "Data":
         {
           "List":
             [
                {
                   "name": "something",
                   "id": "number"
                },
                {
                   "name": "something",
                   "id": "number"
                },
                {
                   "name":"something",
                   "id": "number"
               }
            ] 
        } 
}

2) Здесь" Список "это QJsonObject

{
   "Data":
          {
            "List":
               {
                  "name": "something",
                  "id": "number"
               }
          }
}

Заранее спасибо.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Я предполагаю, что вы уже проанализировали свой ответ сервера в действительный QJsonObject.Используя QJsonValue QJsonObject::operator[](QString), мы получаем QJsonValue, который в основном является типом варианта.Вы можете запросить тип значения различными bool QJsonValue::is*() методами.В вашем случае вам нужно bool QJsonValue::isArray() и bool QJsonIsObject().

auto dataNode = serverResponse["Data"];
if(dataNode.isObject()) {
  auto dataObject = dataNode.toObject();
  // handle object case
}
else if(dataNode.isArray()) {
  auto dataArray = dataNode.toArray();
  // handle array case
}
0 голосов
/ 01 октября 2018

Первый json, который сэмплирует, недопустим, поэтому я подожду, пока вы исправите его, чтобы указать правильный тест, в случае второго пропуска только запятая.Но при переходе к точке, когда вы получаете доступ к полю QJsonObject или QJsonArray, возвращается QJsonValueRef, который является помощником, который обрабатывает несколько типов данных, и вы знаете, является ли это QJsonObject или QJsonArray Вы должны использовать метод isObject() или isArray():

const QByteArray json = R"(
                          {
                              "Data": {
                                  "List": {
                                      "name": "something",
                                      "id": "number"
                                  }
                              }
                          }
                          )";

QJsonDocument doc = QJsonDocument::fromJson(json);
QJsonObject obj = doc.object();
QJsonValueRef list_ref = doc["Data"].toObject()["List"];

if(list_ref.isObject())
    qDebug()<< list_ref <<"is Object";
else if (list_ref.isArray()) {
    qDebug()<< list_ref << "is array";
}

Выход:

QJsonValue(object, QJsonObject({"id":"number","name":"something"})) is Object

Тогда как в вашем первом примере вы хотели показать следующий действительный json:

{
    "Data": {
        "List": [{
            "name": "something",
            "id": "number"
        }, {
            "name": "something",
            "id": "number"
        }, {
            "name": "something",
            "id": "number"
        }]
    }
}

Если вы используете тот же метод, вы получите:

QJsonValue(array, QJsonArray([{"id":"number","name":"something"},{"id":"number","name":"something"},{"id":"number","name":"something"}])) 
is array
...