gpt4 book ai didi

json - QNetworkAccessManager 解析 JSON

转载 作者:行者123 更新时间:2023-12-01 04:58:05 25 4
gpt4 key购买 nike

我是 Qt 新手。开始研究如何绕过 HTML5 移动应用程序的限制。我正在尝试在 Qt 中解析 JSON 数据。这个想法是应用程序将使用 SQLite 进行离线模式,并在在线时连接到 API。我在网上找到了一份指南,但它似乎不适用于我的 API

#include <QCoreApplication>
#include <QDebug>
#include <QApplication>
#include <QtWebKitWidgets/QWebFrame>
#include <QtWebKitWidgets/QWebPage>
#include <QtWebKitWidgets/QWebView>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QWebSettings>
#include <QVariant>
#include <QJsonValue>
#include <QJsonDocument>
#include <QJsonObject>
#include <QVariantMap>
#include <QJsonArray>

void sendRequest();

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
sendRequest();
return a.exec();
}

void sendRequest() {

// create custom temporary event loop on stack
QEventLoop eventLoop;

// "quit()" the event-loop, when the network request "finished()"
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

// the HTTP request
QNetworkRequest req( QUrl( QString("http://127.0.0.1:8000/api/v1") ) );
QNetworkReply *reply = mgr.get(req);
eventLoop.exec(); // blocks stack until "finished()" has been called

if (reply->error() == QNetworkReply::NoError) {

QString strReply = (QString)reply->readAll();

//parse json
qDebug() << "Response:" << strReply;
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());

QJsonObject jsonObj = jsonResponse.object();

qDebug() << "username:" << jsonObj["username"].toString();
qDebug() << "password:" << jsonObj["password"].toString();

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

应用程序接口(interface)

[
{
"id": 1,
"username": "admin",
"password": "qwerty"
},
{
"id": 2,
"username": "chris",
"password": "1234"
}
]

我得到的结果是:

Response: ""
username: ""
password: ""

最佳答案

根据 strReply 的值(它是一个空 QString),我认为 JSON 解析与您的问题没有任何关系。 readAll () 的文档指出:

This function has no way of reporting errors; returning an empty QByteArray() can mean either that no data was currently available for reading, or that an error occurred.

这看起来像是这里发生的事情。您的代码应该可以工作,但我会再次检查 URL http://127.0.0.1:8000/api/v1。我不知道它是什么类型的 API,但它会返回您粘贴的 JSON 而没有在 URL 中提供一些额外参数,这看起来很奇怪。

编辑:

您的 API 返回一个 JSON 数组,但您将其作为对象处理。而不是 QJsonObject jsonObj = jsonResponse.object(); 尝试:

    QJsonArray json_array = jsonResponse.array();

foreach (const QJsonValue &value, json_array) {
QJsonObject json_obj = value.toObject();
qDebug() << json_obj["username"].toString();
qDebug() << json_obj["password"].toString();
}

关于json - QNetworkAccessManager 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28499619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com