web-dev-qa-db-fra.com

moyen le plus simple d'analyser JSON dans Qt 4.7

J'ai besoin d'analyser l'objet JSON via Qt. Quel est le moyen le plus simple/le plus rapide de le faire?

30
wael34218

Essayez QJson .

QJson est activement développé (et utilisé par KDE, si je ne me trompe pas). Le mieux est d'extraire directement le code source et de le créer vous-même. Il n'y a aucune dépendance à QJson (à l'exception de Qt et CMake). C'est assez simple à utiliser aussi, jetez un œil à quelques exemples d'utilisation:

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

16
Etienne Savard

L'analyse JSON est désormais 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();
18
laurent

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

http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library

8
guruz

Voici l'encodeur/décodeur json de style Qt

#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
user2243820

Je sais que cette réponse est en retard, mais j'ai récemment créé un projet pour aider à créer du code destiné à être compilé sur Qt4 et Qt5 et traite de JSON.

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

Cette bibliothèque est en retrait pour remplacer QJsonDocument dans Qt4 et utilisera les classes de Qt lorsqu'elle sera utilisée dans Qt5. La transition devrait donc être assez fluide. Ce n'est pas complet à 100%, mais les principales fonctionnalités sont là :-).

6
Evan Teran

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

Vous pouvez charger la bibliothèque de manière conditionnelle lorsque vous utilisez Qt4 et utiliser l'implémentation par défaut lorsque vous utilisez Qt5.

Ma qjson.pri le fichier ressemble à:

!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
AntonyG