【问题标题】:easiest way to parse JSON in Qt 4.7在 Qt 4.7 中解析 JSON 的最简单方法
【发布时间】:2011-05-09 08:55:47
【问题描述】:

我需要通过 Qt 解析 JSON 对象。最简单/最快的方法是什么?

【问题讨论】:

标签: json qt parsing qt4 qjson


【解决方案1】:

Qt 5 现在支持 JSON 解析。以下是加载和解析文档的方法:

#include <QByteArray>
#include <QFile>
#include <QJsonObject>
#include <QJsonDocument>

// ...

// Read JSON file
QFile file("/path/to/file.json");
file.open(QIODevice::ReadOnly);
QByteArray rawData = file.readAll();

// Parse document
QJsonDocument doc(QJsonDocument::fromJson(rawData));

// Get JSON object
QJsonObject json = doc.object();

// Access properties
qDebug() << json["something"].toString();

【讨论】:

  • 问题是关于4.7版
【解决方案2】:

试试QJson

QJson 是积极开发的(如果我没记错的话,KDE 也使用它)。最好是直接签出源代码并自己构建。对 QJson 没有依赖关系(Qt 和 CMake 除外)。使用起来也很简单,看看一些用法示例:

http://qjson.sourceforge.net/usage/

【讨论】:

    【解决方案3】:

    如果您不想依赖外部库,可以使用 QScriptEngine

    http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library

    【讨论】:

    • Linkrot。来自一些随机的“信息”域。什么都不感谢。
    【解决方案4】:

    这里是 Qt 风格的 json 编码器/解码器

    #include "json.h"
    
    #include <QScriptEngine>
    #include <QScriptValueIterator>
    
    Json::Json()
    {
    }
    
    
    QString Json::encode(const QMap<QString,QVariant> &map)
    {
        QScriptEngine engine;
        engine.evaluate("function toString() { return JSON.stringify(this) }");
    
        QScriptValue toString = engine.globalObject().property("toString");
        QScriptValue obj = encodeInner(map, &engine);
        return toString.call(obj).toString();
    
    }
    
    QMap<QString, QVariant> Json::decode(const QString &jsonStr)
    {
        QScriptValue object;
        QScriptEngine engine;
        object = engine.evaluate("(" + jsonStr + ")");
        return decodeInner(object);
    }
    
    QScriptValue Json::encodeInner(const QMap<QString,QVariant> &map, QScriptEngine* engine)
    {
        QScriptValue obj = engine->newObject();
        QMapIterator<QString, QVariant> i(map);
        while (i.hasNext()) {
            i.next();
            if (i.value().type() == QVariant::String)
                obj.setProperty(i.key(), i.value().toString());
            else if (i.value().type() == QVariant::Int)
                obj.setProperty(i.key(), i.value().toInt());
            else if (i.value().type() == QVariant::Double)
                obj.setProperty(i.key(), i.value().toDouble());
            else if (i.value().type() == QVariant::List)
                obj.setProperty(i.key(), qScriptValueFromSequence(engine, i.value().toList()));
            else if (i.value().type() == QVariant::Map)
                obj.setProperty(i.key(), encodeInner(i.value().toMap(), engine));
        }
        return obj;
    }
    
    
    QMap<QString, QVariant> Json::decodeInner(QScriptValue object)
    {
        QMap<QString, QVariant> map;
        QScriptValueIterator it(object);
        while (it.hasNext()) {
            it.next();
            if (it.value().isArray())
                map.insert(it.name(),QVariant(decodeInnerToList(it.value())));
            else if (it.value().isNumber())
                map.insert(it.name(),QVariant(it.value().toNumber()));
            else if (it.value().isString())
                map.insert(it.name(),QVariant(it.value().toString()));
            else if (it.value().isNull())
                map.insert(it.name(),QVariant());
            else if(it.value().isObject())
                map.insert(it.name(),QVariant(decodeInner(it.value())));
        }
        return map;
    }
    
    QList<QVariant> Json::decodeInnerToList(QScriptValue arrayValue)
    {
        QList<QVariant> list;
        QScriptValueIterator it(arrayValue);
        while (it.hasNext()) {
            it.next();
            if (it.name() == "length")
                continue;
    
            if (it.value().isArray())
                list.append(QVariant(decodeInnerToList(it.value())));
            else if (it.value().isNumber())
                list.append(QVariant(it.value().toNumber()));
            else if (it.value().isString())
                list.append(QVariant(it.value().toString()));
            else if (it.value().isNull())
                list.append(QVariant());
            else if(it.value().isObject())
                list.append(QVariant(decodeInner(it.value())));
        }
        return list;
    }
    

    【讨论】:

    • 这看起来很不错...但不编译...未定义引用 QScriptEngine::newObject ......我在 json 中添加了#include .h 文件。甚至可以将它与 QT 4.8.1 一起使用。 ?
    • @user568021 用 Qt 4.8.2 编译对我来说很好。
    • 很棒的解决方案!这将是一个不错的仅包含头文件的库,只是包含并使用所有具有无限依赖关系的构建库。将 QMap 变成一个对象的东西会让它变得完美。我设法做到了,我将把代码留在这里与您的代码一起使用。
    【解决方案5】:

    我知道这个答案来晚了,但我最近创建了一个项目来帮助创建代码,该代码旨在在 Qt4 和 Qt5 上编译并处理 JSON。

    https://code.google.com/p/qjson4/

    这个库是为了替代 Qt4 中的QJsonDocument 而在 Qt5 中使用时将使用 Qt 的类。所以这应该是一个相当平稳的过渡。它不是 100% 完成的,但主要功能都在里面 :-)。

    【讨论】:

    • 我赞成的好答案。只需在QJsonValue.h:Q_DECLARE_METATYPE(QJsonValue) 中对您的代码进行一点补充,以使此类在某些特殊情况下可用。
    • 当然,我可以补充:-)
    【解决方案6】:

    我会推荐qjson-backport,因为它使用与 Qt5 中相同的 API。

    使用Qt4时可以有条件地加载库,使用Qt5时使用默认实现。

    我的qjson.pri 文件如下所示:

    !greaterThan(QT_MAJOR_VERSION, 4): {
    
        INCLUDEPATH += \
            $$PWD
    
        SOURCES += \
            $$PWD/qjson.cpp \
            $$PWD/qjsonarray.cpp \
            $$PWD/qjsondocument.cpp \
            $$PWD/qjsonobject.cpp \
            $$PWD/qjsonparser.cpp \
            $$PWD/qjsonvalue.cpp \
            $$PWD/qjsonwriter.cpp
    
        HEADERS += \
            $$PWD/qjson_p.h \
            $$PWD/qjsonarray.h \
            $$PWD/qjsondocument.h \
            $$PWD/qjsonobject.h \
            $$PWD/qjsonparser_p.h \
            $$PWD/qjsonvalue.h \
            $$PWD/qjsonwriter_p.h
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2019-05-09
      • 2011-10-25
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多