разделить ответ JSON в Qt - PullRequest
       1

разделить ответ JSON в Qt

0 голосов
/ 21 сентября 2019

Я создал веб-сервис Restful на asp.net и хочу использовать его в своем проекте qt.
Я могу публиковать и получать данные из своего веб-сервиса в SoapUi следующим образом:

enter image description here

, поэтому кажется, что мой веб-сервис Rest работает правильно;

Я использую этот фрагмент кода для извлечения данных из моего веб-сервиса в Qt5:

main.cpp

#include <QCoreApplication>
#include <QtCore/QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <iostream>
using namespace std;
#include <QVariant>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);

QEventLoop eventLoop;
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
QNetworkRequest req( QUrl( QString("http://localhost:63053/api/studentretrive/") ) );
QNetworkReply *reply = mgr.get(req);
eventLoop.exec();

if (reply->error() == QNetworkReply::NoError)
{
    QString strReply = (QString)reply->readAll();
    QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
    QJsonObject jsonObj = jsonResponse.object();
    qDebug()<<"json response : " << jsonResponse;
    qDebug() << "jsonObj count : " << jsonObj.count();
    qDebug() << "name : " << jsonObj["Name"].toString();
    delete reply;

}

else
{
    qDebug() << "Failure" <<reply->errorString();
    delete reply;
}


return 0;
}

main.pro

QT -= gui
QT += network
CONFIG += c++11
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp

когда я запускаю код, это мой вывод:

qt.network.ssl: QSslSocket: cannot resolve SSL_set_alpn_protos
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_alpn_select_cb
qt.network.ssl: QSslSocket: cannot resolve SSL_get0_alpn_selected
json response :  QJsonDocument([{"Age":26,"Name":"user1","RegistrationNumber":"12345"}])
jsonObj count :  0
name :  ""

это означает, что у меня есть ответ от сервера, но у меня нет объекта json, и поэтому я не могу разделить ответ сервера.Я много искал и нашел некоторые решения, но никто не работал для меня.В чем моя проблема? Должен ли я добавить несколько кодов в мой .pro или в коде есть ошибка?
спасибо.

1 Ответ

1 голос
/ 21 сентября 2019

Запрос QJsonDocument, чтобы проверить, содержит ли он массив или объект с bool QJsonDocument::isArray() и bool QJsonDocument::isObject() до извлечения его содержимого.

В зависимости от того, содержит ли QJsonDocumentобъект или массив вы можете сделать правильный поиск, использовать безопасный код, когда вы не знаете или не уверены, что ответ:

QJsonObject jsonObj;
if (jsonResponse.isObject() )
  jsonObj = jsonResponse.object();
else if (jsonResponse.isArray() ) {
 QJsonArray jsonArray = jsonResponse.array();
   foreach (const QJsonValue & value, jsonArray ) {
    jsonObj  = value.toObject();
    qDebug() << "name : " << jsonObj["Name"].toString();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...