Как пользоваться QJsonDocument

534
04 мая 2017, 15:32

Подскажите пожалуйста как пользоваться QJsonDocument. Я cделал запрос на сервер. Получаю ответ в таком формате: [{"id":229,"creator":123,"name":"\u0421\u0443\u0431\u0430\u0440\u0438\u043a \u0418\u043c\u043f\u0440\u0435\u0437\u0430 \u0413\u043e\u043d\u043a\u0430"}, {"id":229,"creator":123,"name":"\u0421\u0443\u0431\u0430\u0440\u0438\u043a \u0418\u043c\u043f\u0440\u0435\u0437\u0430 \u0413\u043e\u043d\u043a\u0430"}]

Это массив объектов. Мне нужно вытащить из ответа: name. В поле name содержаться русские символы представлены символами юникода. В конечном итоге мне нужно получить из ответа значение параметра name на русском языке. Пробывал такой код, но он не работает, подскажите пожалуйста что не так:

QUrl url(urlStr);
QNetworkRequest request(url);
QEventLoop loop;
QNetworkAccessManager manager;
connect(&manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
QNetworkReply *reply = manager.get(request);
loop.exec();
QString data = reply->readAll();

QJsonDocument d = QJsonDocument::fromJson(reply->readAll());
QJsonObject root = d.object();
QJsonValue jv = root.value("name");
QString str = jv.toString();
Answer 1

[] обозначают массив в json-формате, поэтому следует .array() метод использовать, а не .object():

QJsonArray array = QJsonDocument::fromJson(json_text).array();
for (const QJsonValue& v : array)
  qDebug() << "name: " << v.toObject()["name"].toString();

Полный пример (получить свой внешний ip c https://httpbin.org/ используя Qt):

#include <QCoreApplication>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
int main(int argc, char *argv[])
{
  QCoreApplication app(argc, argv);
  QNetworkAccessManager manager {&app};
  QObject::connect(&manager, &QNetworkAccessManager::finished, [&app] (QNetworkReply* reply) {
      if (reply->error() == QNetworkReply::NoError) {
        QByteArray json_data = reply->readAll();
        qDebug() << "json: " << json_data;
        QJsonDocument json_doc = QJsonDocument::fromJson(json_data);
        auto data = json_doc.object();
        qDebug() << "public ip: " << data["origin"].toString();
        app.quit();
      } else {
        qDebug() << "error: " << reply->error();
        app.exit(1);
      }
    });
  manager.get(QNetworkRequest(QUrl("https://httpbin.org/ip")));
  return app.exec();
}

Файл read-json.pro:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG += c++11
QT += core
QT -= gui
QT += network
TARGET = read-json
INCLUDEPATH += .
# Input
SOURCES += read-json.cc

Чтобы собрать и запустить:

$ qmake && make && ./read-json

См. также JSON Save Game Example.

READ ALSO
C++ Парсинг строки

C++ Парсинг строки

Привет всемЕсть строка с аргументами к примеру "Привет, меня зовут %1, мне %2 лет

489
Игнорирование delete для указателя на объект в статической памяти

Игнорирование delete для указателя на объект в статической памяти

"Использование оператора delete на указателе на объект, который не был создан при помощи оператора new, создает непрогнозируемый результат" (сайт...

326
OpenGl и ввод значений

OpenGl и ввод значений

Здравствуйте, помогите пожалуйста

405
Класс для pаботы с комплексными числами. [требует правки]

Класс для pаботы с комплексными числами. [требует правки]

Подскажите, как создать наследников класса: 1класс, хранящий число так же в виде строки и имеющий методы перевода строки в число и назад; 2

271