la façon la plus facile de parser JSON en Qt 4.7

je dois analyser l'objet JSON à travers Qt. Quelle est la plus facile et la plus rapide façon de le faire?

28
demandé sur this.lau_ 2010-11-13 02:38:13

6 réponses

QJson.

QJson est développé activement (et utilisé par KDE, si Je ne me trompe pas). Le mieux est de regarder le code source directement et construit vous-même. Il n'y a pas de dépendances à QJson (sauf pour Qt et CMake). C'est assez simple à utiliser, jetez un oeil à quelques exemples d'utilisation :

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

15
répondu Etienne Savard 2012-12-21 20:47:14

l'analyse JSON est maintenant prise en charge dans Qt 5. Voici comment charger et analyser un 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();
17
répondu this.lau_ 2014-05-23 21:53:28

si vous ne voulez pas dépendre de bibliothèques externes, vous pouvez utiliser la QScriptEngine

http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library

8
répondu guruz 2012-12-20 12:19:41

Voici Qt style json encodeur/décodeur

#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;
}
8
répondu user2243820 2013-04-04 08:10:06

je sais que cette réponse est tardive, mais j'ai récemment créé un projet pour aider à créer du code qui est destiné à compiler sur Qt4 et Qt5 et traite avec JSON.

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

Cette bibliothèque est mis en retrait pour être remplacer QJsonDocument en Qt4, et d'utiliser les classes de Qt lorsque utilisé en Qt5. La transition devrait donc se faire en douceur. Ce n'est pas 100% complet, mais les principales fonctionnalités sont là :-).

6
répondu Evan Teran 2014-01-22 05:38:14

je recommanderais qjson-backport, car il utilise la même API que dans Qt5.

vous pouvez conditionnellement charger la bibliothèque lorsque vous utilisez Qt4, et utiliser l'implémentation par défaut lorsque vous utilisez Qt5.

le fichier ressemble à ceci:

!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

}
0
répondu AntonyG 2015-07-10 12:53:58