QT下Json解析方案比较
来源:互联网 发布:淘宝网旺旺在哪里 编辑:程序博客网 时间:2024/04/28 16:24
关于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的网络翻译接口来翻译单词,具体参见:
http://download.csdn.net/detail/work4blue/8728153
- QT下Json解析方案比较
- Qt JSON解析
- Qt 解析json
- QT解析JSON
- Qt之json解析
- Qt json解析
- QT Json解析方法
- Qt的json解析
- Qt 解析Json
- QT 解析JSON
- qt 解析json文件
- qt json解析
- Qt之JSON解析
- QT Json 解析
- QT 解析JSon字符串
- QT 下 json格式数据的 生成 和 解析
- JSON在C/C++下的运用 及 Qt解析Json实例
- 关于Qt-json解析器
- SpringMVC全局文件上传类型限制【终极解决方案】
- Hessian实现Webservice
- Java基础--定时任务Timer
- vs2010:First-chance exception
- 各种杂七咋八的整理
- QT下Json解析方案比较
- LeetCode算法题之Plus One
- Anniversary party求助
- 程序员编程面试取胜的8个技巧
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
- Hessian
- android 字符设置之SpannableStringBuilder
- 在Linux下改变进程的优先级
- python 正则表达式