Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为Qt-Quick解析JSON?_C++_Json_Qt_Qt5_Qt Quick - Fatal编程技术网

C++ 如何为Qt-Quick解析JSON?

C++ 如何为Qt-Quick解析JSON?,c++,json,qt,qt5,qt-quick,C++,Json,Qt,Qt5,Qt Quick,我试图做一个简单的编程,将JSON消息值从web解析到QtQuick JSON消息要解析: [ { "id": 2, "name": "yahoo", "link": "http://www.yahoo.com/", "created_by": "superadmin", "create_time": "2015-03-12 14:45:21" }, { "id":

我试图做一个简单的编程,将JSON消息值从web解析到QtQuick

JSON消息要解析:

[
    {
         "id": 2,
         "name": "yahoo",
         "link": "http://www.yahoo.com/",
         "created_by": "superadmin",
         "create_time": "2015-03-12 14:45:21"
    },
    {
         "id": 3,
         "name": "Google",
         "link": "http://www.google.com/",
         "created_by": "superadmin",
         "create_time": "2015-03-12 14:45:41"
    },
    {
         "id": 4,
         "name": "PS",
         "link": "http://www.playstation.com",
         "created_by": "superadmin",
         "create_time": "2015-03-24 11:57:21"
    }
]
以下是尝试解析这些数据的Qt代码main.cpp:

#include <QGuiApplication>
#include <QStringList>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QtScript/QScriptEngine>
#include <QtScript/QScriptValueIterator>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <main.h>



QStringList Jsondata::datalistmethod() {

   return datalist;
}


void Jsondata::onResult(QNetworkReply* reply)
{

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


    QJsonDocument jsonResponse = QJsonDocument::fromJson(data.toUtf8());
    QJsonObject jsonObject = jsonResponse.object();


    foreach (const QJsonValue & value, jsonObject) {
        QJsonObject obj = value.toObject();
        datalist.append(obj["name"].toString());
        datalist.append(obj["link"].toString());
    }
}

int main(int argc, char ** argv)
{
    QGuiApplication app(argc, argv);
    Jsondata jsondata;
    // Now parse this JSON according to your needs !
   QNetworkAccessManager networkManager;
   networkManager.setNetworkAccessible(QNetworkAccessManager::Accessible);

   QUrl url("http://dbs.wasonicsystem.com/gta_test/api/web/v1/links");
   QNetworkRequest request;
   request.setUrl(url);

   Jsondata::connect(&networkManager, SIGNAL(finished(QNetworkReply*)), &jsondata, SLOT(onResult(QNetworkReply*)));
    networkManager.get(request);   // GET

    QStringList datalist;
    datalist = jsondata.datalistmethod();

    QQuickView view;
    QQmlContext *ctxt = view.rootContext();
    ctxt->setContextProperty("myModel", QVariant::fromValue(datalist));

    view.setSource(QUrl("qrc:main.qml"));
    view.show();

    return app.exec();
}
结果: onResult仍然没有调用。所以没有返回数据列表


我不知道这个
QObject::connect
有什么问题。如果您能帮助我修复此错误,我将不胜感激。

我终于找到了解决此问题的方法。下面是代码片段

main.cpp

#include <QGuiApplication>
#include <QStringList>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <jsondata.h>

int main(int argc, char ** argv)
{
    QGuiApplication app(argc, argv);
    QStringList datalist;
    Jsondata jsondata;
    jsondata.datalistmethod();
    datalist = jsondata.datalist;

    QQuickView view;
    QQmlContext *ctxt = view.rootContext();
    ctxt->setContextProperty("myModel", QVariant::fromValue(datalist));
    view.setSource(QUrl("qrc:main.qml"));
    view.show();

    return app.exec();

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
QGUI应用程序应用程序(argc、argv);
QStringList数据表;
杰森达杰森达;
jsondata.datalistmethod();
datalist=jsondata.datalist;
QQuickView视图;
QQmlContext*ctxt=view.rootContext();
ctxt->setContextProperty(“myModel”,QVariant::fromValue(datalist));
view.setSource(qrl(“qrc:main.qml”);
view.show();
返回app.exec();
}
jsondata.h

#ifndef JSONDATA_H
#define JSONDATA_H
#include <QObject>
#include <QNetworkReply>
#include <QStringList>
#include <QNetworkAccessManager>
class Jsondata : public QObject {
    Q_OBJECT
public:
    QStringList datalist;
    explicit Jsondata(QObject *parent =0);
    void datalistmethod();
public slots:
    void onResult (QNetworkReply*);

private:
    QNetworkAccessManager *manager;
};
\ifndef JSONDATA\u H
#定义JSONDATA_H
#包括
#包括
#包括
#包括
类Jsondata:公共QObject{
Q_对象
公众:
QStringList数据表;
显式Jsondata(QObject*parent=0);
void datalistmethod();
公众时段:
void onResult(QNetworkReply*);
私人:
QNetworkAccessManager*管理器;
};
jsondata.cpp

#include "jsondata.h"
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QEventLoop>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <QTimer>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>

Jsondata::Jsondata(QObject *parent) :
    QObject(parent)
{

}


void Jsondata::datalistmethod() {
    // Now parse this JSON according to your needs !
   manager = new QNetworkAccessManager(this);

   manager->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QNetworkRequest request;
   QEventLoop eventloop;
   QUrl url("http://***/api/web/v1/links");
    request.setUrl(url);
     QNetworkReply *reply = manager->get(request);
   connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
   eventloop.exec();
   onResult(reply);

}


void Jsondata::onResult(QNetworkReply* reply)
{
    QString data = (QString) reply->readAll();
    qDebug() << "Response:" << data;
    QJsonDocument jsonResponse = QJsonDocument::fromJson(data.toUtf8());
    QJsonArray jsonArray = jsonResponse.array();
    foreach (const QJsonValue & value, jsonArray) {
        QJsonObject obj = value.toObject();
        datalist.append(obj["name"].toString());
        datalist.append(obj["link"].toString());
    }
}
#包括“jsondata.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
Jsondata::Jsondata(QObject*父对象):
QObject(父对象)
{
}
void Jsondata::datalistmethod(){
//现在根据您的需要解析这个JSON!
manager=新的QNetworkAccessManager(此);
管理器->设置网络可访问(QNetworkAccessManager::可访问);
QNetworkRequest请求;
QEventLoop事件循环;
QUrl url(“http://***/api/web/v1/links”);
setUrl(url);
QNetworkReply*reply=manager->get(请求);
连接(应答、信号(finished())、&eventloop、插槽(quit());
eventloop.exec();
结果(答复);
}
void Jsondata::onResult(QNetworkReply*reply)
{
QString data=(QString)reply->readAll();

qDebug()您正在尝试创建一个到一个对象的连接,该对象不是从
QObject
(您的
JsonData
类)派生的。当然,您可以只看文档:调用
QObject::connect(&networkManager,SIGNAL(finished(QNetworkReply*)非常奇怪,这个插槽(onResult(QNetworkReply*))
内部
onResult
插槽。看起来应用程序的逻辑已中断。感谢您的回答。我尝试从Qobject派生。它修复了错误。但我仍然无法从json消息中获得结果,因为我发现它没有调用onResult方法。我修改了发布的代码,并添加了main.qml供参考。我希望任何人都能请帮助我完成。谢谢。大家好,我使用另一种方式再次编辑了我的问题,但在连接过程中仍然没有触发onResult。请告诉我您是否有任何解决问题的想法。谢谢。您的代码中有很多失败的机会,并且没有错误检查。
#ifndef JSONDATA_H
#define JSONDATA_H
#include <QObject>
#include <QNetworkReply>
#include <QStringList>
#include <QNetworkAccessManager>
class Jsondata : public QObject {
    Q_OBJECT
public:
    QStringList datalist;
    explicit Jsondata(QObject *parent =0);
    void datalistmethod();
public slots:
    void onResult (QNetworkReply*);

private:
    QNetworkAccessManager *manager;
};
#include "jsondata.h"
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QEventLoop>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
#include <QTimer>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>

Jsondata::Jsondata(QObject *parent) :
    QObject(parent)
{

}


void Jsondata::datalistmethod() {
    // Now parse this JSON according to your needs !
   manager = new QNetworkAccessManager(this);

   manager->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QNetworkRequest request;
   QEventLoop eventloop;
   QUrl url("http://***/api/web/v1/links");
    request.setUrl(url);
     QNetworkReply *reply = manager->get(request);
   connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
   eventloop.exec();
   onResult(reply);

}


void Jsondata::onResult(QNetworkReply* reply)
{
    QString data = (QString) reply->readAll();
    qDebug() << "Response:" << data;
    QJsonDocument jsonResponse = QJsonDocument::fromJson(data.toUtf8());
    QJsonArray jsonArray = jsonResponse.array();
    foreach (const QJsonValue & value, jsonArray) {
        QJsonObject obj = value.toObject();
        datalist.append(obj["name"].toString());
        datalist.append(obj["link"].toString());
    }
}