在 Qt 4.7 中解析 JSON 的最简单方法

发布于 2024-10-02 23:31:26 字数 40 浏览 0 评论 0原文

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

I need to parse JSON object through Qt. What is the easiest/fastest way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

另类 2024-10-09 23:31:26

尝试 QJson

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

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

Try QJson.

QJson is actively developed (and used by KDE, if I'm not mistaken). The best is to checkout the source code directly and built it yourself. There is no dependencies to QJson (except for Qt and CMake). It's pretty simple to use too, have a look at some usage examples :

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

奶茶白久 2024-10-09 23:31:26

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();

JSON parsing is now supported in Qt 5. Here's how to load and parse a document:

#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();
镜花水月 2024-10-09 23:31:26

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

http://qtwiki.remdex.info/ Parsing_JSON_with_QT_using_standard_QT_library

If you don't want to depend on external libraries you could use the QScriptEngine

http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library

我纯我任性 2024-10-09 23:31:26

这是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;
}

Here is Qt style json encoder/decoder

#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;
}
菩提树下叶撕阳。 2024-10-09 23:31:26

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

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

该库缩进为Qt4 中 QJsonDocument 的替代品,并且在 Qt5 中使用时将使用 Qt 的类。所以这应该是一个相当平稳的过渡。它不是 100% 完整,但主要功能都在其中:-)。

I know this answer is late, but I recently created a project to help create code which is meant to compile on both Qt4 and Qt5 and deals with JSON.

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

This library is indented to be a drop in replacement for QJsonDocument in Qt4 and will use Qt's classes when used in Qt5. So it should be a fairly smooth transition. It's not 100% complete, but the major features are in there :-).

鼻尖触碰 2024-10-09 23:31:26

我推荐 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

}

I would recommend qjson-backport, as it uses the same API as in Qt5.

You can conditionally load the library when you use Qt4, and use the default implementation when using Qt5.

My qjson.pri file looks like:

!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

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文