Разбор безымянного массива 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
}]