Разбор безымянного массива JSON из веб-службы в Qt

Я пытаюсь проанализировать этот JSON из веб-службы.

  [
      {
        "word": "track",
        "score": 4144
      },
      {
        "word": "trail",
        "score": 2378
      },
      {
        "word": "domestic dog",
        "score": 51
      },
      {
        "word": "dogiron"
      }
  ]

Когда я выписываю ответ от вызова API как QString, как показано ниже, он получается нормально, но со всеми кавычками экранируется, таким образом не делая его действительным JSON:

QString response = (QString) data->readAll();
qDebug() << "Return data: \n" << response;

Примеры, которые я видел до сих пор (например, Parse jsonarray?), Анализируют только именованные массивы, которые они извлекают из QJsonObject по имени. Любые советы о том, как использовать QJsonArray прямо или вместе с QJsonDocument::fromJson() на возврат данных?

2 ответа

Решение

QJsonDocument имеет члена под названием array() который возвращает QJsonArray содержится в документе.

Например:

QFile file("main.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray jsonData = file.readAll();
file.close();

QJsonParseError parseError;
QJsonDocument document = QJsonDocument::fromJson(jsonData, &parseError);

if (parseError.error != QJsonParseError::NoError)
{
    qDebug() << "Parse error: " << parseError.errorString();
    return;
}

if (!document.isArray())
{
    qDebug() << "Document does not contain array";
    return;
}

QJsonArray array = document.array();

foreach (const QJsonValue & v, array)
{
    QJsonObject obj = v.toObject();
    qDebug() << obj.value("word").toString();
    QJsonValue score = obj.value("score");
    if (!score.isUndefined())
        qDebug() << score.toInt();
}

Вы пробовали ThorsSerializer?

Код

#include "ThorSerialize/JsonThor.h"
#include "ThorSerialize/SerUtil.h"
#include <sstream>
#include <iostream>
#include <string>



struct MyObj
{
    std::string word;
    int         score;
};
ThorsAnvil_MakeTrait(MyObj, word, score);

Пример использования:

int main()
{
    using ThorsAnvil::Serialize::jsonImport;
    using ThorsAnvil::Serialize::jsonExport;

    std::stringstream file(R"(
    [
      {
        "word": "track",
        "score": 4144
      },
      {
        "word": "trail",
        "score": 2378
      },
      {
        "word": "domestic dog",
        "score": 51
      },
      {
        "word": "dogiron"
      }
    ])");

    std::vector<MyObj>   data;
    file >> jsonImport(data);


    std::cout << data[1].score << " Should be 2378\n";
    std::cout << "----\n";
    std::cout << jsonExport(data) << "\n";
}

Выход:

2378 Should be 2378
----
 [
        {
            "word": "track",
            "score": 4144
        },
        {
            "word": "trail",
            "score": 2378
        },
        {
            "word": "domestic dog",
            "score": 51
        },
        {
            "word": "dogiron",
            "score": -301894816
        }]
Другие вопросы по тегам