2016-12-17 62 views
0

我想知道,如何解析QT中的关联JSON数组。如何解析QT中的关联JSON数组?

这是我的例子JSON:

{ 
    "req_code": 5, 
    "params": { 
     "email":"[email protected]", 
     "password":"123" 
    } 
} 

因此,为了得到电子邮件(从名为 '数据' JSON字符串)我会做这样的事情:

QJsonDocument doc=QJsonDocument::fromJson(data.toUtf8()); 
QJsonObject jobj=doc.object(); 
QJsonValue params_value=jobj.value(QString("params")); 
QJsonArray params_array=params_value.toArray(); 

现在,'email'被保存在'params_array'对象中,但是这个数组不是QHash而不是QMap。如果这将是一个QHash我会得到电子邮件:

QString email=params_array.value("email"); 

但它不是一个哈希,它是一个向量。那么在这种情况下,如何以适当和快速的方式获得'email'属性的价值?

+0

在你的JSON例子中,'params'的值是一个对象,而不是一个数组。 –

+0

@ O'Neil好的。你知道如何从'jobj'变量中获得一个QJsonObject,它也是一个QJsonObject类型?文档没有这样的方法,大多数方法都返回QJsonValue。 – Nulik

+0

您只需将[QJsonValue params_value]转换为QJsonObject与[QJsonValue :: toObject()](http://doc.qt.io/qt-5/qjsonvalue.html#toObject-1)而不是QJsonArray 。 –

回答

1

params的值是一个对象,并QJsonObject提供map-like functions所以你可以很容易地访问它:

auto doc = QJsonDocument::fromJson(data.toUtf8()); 
auto docObj = doc.object(); 
auto paramsObj = docObj["params"].toObject(); 
auto email = paramsObj["email"]; 

而且documentation说:

所有JSON类基于价值,隐式共享类。

所以你并不需要太在乎性能。如果要将QJsonObject转换为哈希或映射,则可以使用QJsonObject::toVariantHashQJsonObject::toVariantMap

+0

对这个问题感到抱歉,但是什么是“基于价值”的课程?在谷歌找不到关于它的任何文档。 – Nulik

+0

这意味着一切都是按价值传递。例如,'QJsonValue :: toObject'通过值返回一个新的对象,而不是通过引用。然而,对象是_implicitly shared_,只有内部指针被复制,你不需要担心性能。 – mcchu

+0

非常感谢你,编译和测试我的代码,它完美的工作,就像我想要的一样。 – Nulik

0

试试这个;

 QJsonArray params_array = jobj.value("params").toArray(); 
     qDebug() << "params_array:: results array size = " << params_array.count(); 
     foreach (const QJsonValue & value, a) 
     { 
      QJsonObject obj = value.toObject(); 
      qDebug() << "obj keys " << obj.keys() ; 
      // here you can access your data, verify your keys with the debug a 
     } 
+0

但您正在扫描整个数组,在这里搜索关键字。对于长阵列来说这是低效的。没有任何形式将JSON数组转换为QHash或QMap? – Nulik