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的网络翻译接口来翻译单词,具体参见:

http://download.csdn.net/detail/work4blue/8728153

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。