C++ QJsonDocument要在c+中列出或数组+;
我已经尝试过这段代码,但我不明白如何使用Qt获取json并在数组或列表中进行转换。 我的代码:C++ QJsonDocument要在c+中列出或数组+;,c++,arrays,json,list,qt,C++,Arrays,Json,List,Qt,我已经尝试过这段代码,但我不明白如何使用Qt获取json并在数组或列表中进行转换。 我的代码: QEventLoop eventLoop; QNetworkAccessManager mgr; QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); QNetworkRequest req(QUrl(QString("http://myurljson.com/ge
QEventLoop eventLoop;
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
QNetworkRequest req(QUrl(QString("http://myurljson.com/getjson")));
QNetworkReply *reply = mgr.get(req);
eventLoop.exec(); // blocks stack until "finished()" has been called
if (reply->error() == QNetworkReply::NoError) {
QString strReply = (QString)reply->readAll();
qDebug() << "Response:" << strReply;
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonObject jsonObj = jsonResponse.object();
qDebug() << "test:" << jsonObj["MCC_Dealer"].toString();
qDebug() << "test1:" << jsonObj["MCC_User"].toString();
delete reply;
}
else {
//failure
qDebug() << "Failure" <<reply->errorString();
delete reply;
}
QEventLoop事件循环;
QNetworkAccessManager经理;
QObject::connect(&mgr,信号(完成(QNetworkReply*)),&eventLoop,插槽(退出());
QNetworkRequest请求(QUrl)(QString(“http://myurljson.com/getjson")));
QNetworkReply*reply=manager.get(req);
eventLoop.exec();//阻止堆栈,直到调用“finished()”
如果(回复->错误()==QNetworkReply::NoError){
QString streply=(QString)reply->readAll();
qDebug()正如我在评论中提到的,您的JSON响应已经是一个数组,因此您不需要创建额外的结构来存储您获得的数据。为了反序列化您的数据,您可以执行以下操作:
[..]
QJsonArray jsonArray = jsonResponse.array();
for (auto it = jsonArray.constBegin(); it != jsonArray.constEnd(); ++it)
{
const QJsonValue &val = *it;
// We expect that array contains objects like:
// {"MCC_Dealer":'test',"MCC_User":'test',"CurrentDealer":'test',"CurrentUser":'test'}
QJsonObject o = val.toObject();
// Iterate over all sub-objects. They all have string values.
for (auto oIt = o.constBegin(); oIt != o.constEnd(); ++oIt)
{
// "MCC_Dealer":'test'
qDebug() << "Key:" << oIt.key() << ", Value:" << oIt.value().toString();
}
}
[…]
QJsonArray-jsonArray=jsonResponse.array();
for(auto-it=jsonArray.constBegin();it!=jsonArray.constEnd();+it)
{
常量QJsonValue&val=*it;
//我们希望数组包含以下对象:
//{“MCC_经销商”:“测试”、“MCC_用户”:“测试”、“当前经销商”:“测试”、“当前用户”:“测试”}
QJsonObject o=val.toObject();
//迭代所有子对象。它们都有字符串值。
对于(自动oIt=o.constBegin();oIt!=o.constEnd();++oIt)
{
//“MCC_经销商”:“测试”
qDebug()正如我在评论中提到的,您的JSON响应已经是一个数组,因此您不需要创建额外的结构来存储您获得的数据。为了反序列化您的数据,您可以执行以下操作:
[..]
QJsonArray jsonArray = jsonResponse.array();
for (auto it = jsonArray.constBegin(); it != jsonArray.constEnd(); ++it)
{
const QJsonValue &val = *it;
// We expect that array contains objects like:
// {"MCC_Dealer":'test',"MCC_User":'test',"CurrentDealer":'test',"CurrentUser":'test'}
QJsonObject o = val.toObject();
// Iterate over all sub-objects. They all have string values.
for (auto oIt = o.constBegin(); oIt != o.constEnd(); ++oIt)
{
// "MCC_Dealer":'test'
qDebug() << "Key:" << oIt.key() << ", Value:" << oIt.value().toString();
}
}
[…]
QJsonArray-jsonArray=jsonResponse.array();
for(auto-it=jsonArray.constBegin();it!=jsonArray.constEnd();+it)
{
常量QJsonValue&val=*it;
//我们希望数组包含以下对象:
//{“MCC_经销商”:“测试”、“MCC_用户”:“测试”、“当前经销商”:“测试”、“当前用户”:“测试”}
QJsonObject o=val.toObject();
//迭代所有子对象。它们都有字符串值。
对于(自动oIt=o.constBegin();oIt!=o.constEnd();++oIt)
{
//“MCC_经销商”:“测试”
qDebug()您的JSON响应是一个数组。数组的每个元素都有四个JSON对象,具有字符串值:“MCC_Dealer”、“MCC_User”、“CurrentDealer”、“CurrentUser”。请澄清,您希望如何将它们存储在列表中。每一行都是一个对象,我想将其放入对象列表中,例如list obj=new list();以及obj.add(line1);等等..我来自c#但我想在c++中这样做,但是您已经有了一个QJsonArray
来存储所提到的每个对象。为什么需要另一个结构(列表)来存储它们呢?如果您编写QJsonArray jsonArray=jsonResponse.array()
我想你会得到你需要的。工作!要调用属性,从第一个元素开始,我执行jsonArray[0]['MCC\u Dealer']?你的JSON响应是一个数组。数组的每个元素都有四个JSON对象,它们的字符串值为:“MCC\u Dealer”、“MCC\u User”、“CurrentDealer”、“CurrentUser”。请澄清,您希望如何将它们存储在列表中。每行都是一个对象,我希望将其放入对象列表中,例如list obj=new list();以及obj.add(line1);等等..我来自c#但我想在c++中这样做,但是您已经有了一个QJsonArray
来存储所提到的每个对象。为什么需要另一个结构(列表)来存储它们呢?如果您编写QJsonArray jsonArray=jsonResponse.array()
我想你会得到你所需要的。工作!要调用属性,从第一个元素开始,我做jsonArray[0]['MCC_Dealer']?回答正确。!是否可以直接调用一个属性?例如,如果我调用jsonArray[0]。key(“MCC_Dealer”)?或类似的东西。我想是的,但方式不同:jsonArray[0]。toObject()。查找(“MCC_Dealer”)。key()
差不多。但我不建议这样做,因为这样做不会检查每个函数调用返回值的正确性,在某些情况下可能会失败。调用属性的解决方案是:在对象中转换,QJsonObject temp=jsonarray[n].toObject();在调用temp.value(“yourvalue”).toString()之后-这很有效。谢谢回答正确。!是否可以直接调用一个属性?例如,如果我调用jsonArray[0]。键(“MCC_经销商”)?或类似。我认为可以,但方式不同:jsonArray[0]。toObject()。find(“MCC_经销商”)。键()
差不多。但我不建议这样做,因为这样你就不会检查每个函数调用返回的值的正确性,在某些情况下可能会失败。调用属性的解决方案是:在对象中转换,QJsonObject temp=jsonarray[n].toObject();在调用temp.value(“yourvalue”).toString();-这很有效。谢谢