QT下Json解析方案比较
关于Json解析
目前有几种流行方案:
1) 调用QScript库解板
2) Qt5 QJsonDocument 库
3)使用QJson库
4) 使用jsoncpp库
5)使用libqxt库中qxtjson
QScript 解析
因为我必须要嵌入式设备和桌面平台同时使用。
第一种方法需要用到QScript库,好不好用单说,光个QScript库 因为包含json,javascript,qml库一整套东西,本身尺寸是QtGui,QtNework,QtSql之类库的总和还要多!
具体参见: http://blog.chinaunix.net/uid-20737871-id-1881233.html
QByteArray result;
result = QhttpClient->readAll();
QScriptValue sc;
QScriptEngine engine;
sc = engine.evaluate(QString(result)); // In new versions it may need to look like engine.evaluate("(" + QString(result) + ")");
if (sc.property("result").isArray())
{
QStringList items;
qScriptValueToSequence(sc.property("result"), items);
foreach (QString str, items) {
qDebug("value %s",str.toStdString().c_str());
}
}
因此这个方案不成熟
QJsonDocument 库
只在Qt5库下执行,但是嵌入式下使用较成熟的Qt 4.8 无法用到
void MainWindow::replyFinished(QNetworkReply* replay)
{
if(replay->error() == QNetworkReply::NoError)
{
QByteArray data = replay->readAll();
QJsonParseError jsonError;//Qt5新类
QJsonDocument json = QJsonDocument::fromJson(data, &jsonError);//Qt5新类
if(jsonError.error == QJsonParseError::NoError)//Qt5新类
{
if(json.isObject())
{
QJsonObject obj = json.object();//Qt5新类
if(obj.contains("weatherinfo"))
{
if(obj["weatherinfo"].isObject())
{
QJsonObject weatherObj = obj["weatherinfo"].toObject();
weatherMap = weatherObj.toVariantMap();
//qDebug() << weatherMap;
showWeather();
return;
}
}
}
}
}
}
QJson 库
用的人较多,但是对于嵌入式支持不太好,移植复杂,
http://qjson.sourceforge.net
jsoncpp 库
代码较小,只有4个cpp文件,移植较方便,只需要把源文件和头文件包含在项目源代码里,简单调整就能直接使用(工作不大)
#include "lib/json/json.h"
void testJson(){
using namespace std;
std::string strValue = "{\"学号\":\"20120207001\",\"姓名\":\"张无忌\",\"性别\":\"男\"}";
Json::Reader reader;
Json::Value value;
if (reader.parse(strValue, value))
{
std::string out = value["学号"].asString();
//std::cout << out << std::endl;
QString tmp = QString::fromUtf8(out.c_str());
qDebug() << tmp;
out = value["姓名"].asString();
//cout << out << std::endl;
tmp = QString::fromUtf8(out.c_str());
qDebug() << tmp;
out = value["性别"].asString();
//cout << out << std::endl;
tmp = QString::fromUtf8(out.c_str());
qDebug() << tmp;
}
}
但是因为是采用std::string ,这样每次转换均需转换成QString ,其它数据结构也是如此转换,比较麻烦
这个是完整的测试样例: http://download.csdn.net/detail/work4blue/8728497
最佳的QxtJson方案
文件很小,只有两个qxtglobal.cpp 和qxtjson.cpp即可。最关键它是直接输出是QVariantMap,QStringList和QString对象!,性能很高。具体引用参见的
http://libqxt.bitbucket.org/doc/0.6/qxtjson.html
const QByteArray rawdata = reply->readAll();
QxtJSON parser;
QVariantMap map = parser.parse(rawdata.data()).toMap();
QVariantMap map2 = map["responseData"].toMap();
const QString result = map2["language"].toString();
演示代码是采用Google /bing的网络翻译接口来翻译单词,具体参见:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。