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

0 0