J'ai besoin d'analyser l'objet JSON via Qt. Quelle est la manière la plus simple/la plus rapide de le faire?façon la plus simple d'analyser JSON dans Qt 4.7
Répondre
Essayez QJson.
QJson est activement développé (et utilisé par KDE, si je ne me trompe pas). Le mieux est de vérifier directement le code source et de le construire vous-même. Il n'y a pas de dépendances à QJson (sauf pour Qt et CMake). Il est assez simple à utiliser aussi jeter un oeil à quelques exemples d'utilisation:
Si vous ne voulez pas dépendre de bibliothèques externes, vous pouvez utiliser le QScriptEngine
http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library
Linkrot. De quelque domaine "info" aléatoire. Merci pour rien. – o9000
ici est encodeur JSON de style Qt/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;
}
Cela semble très agréable ... mais ne compile pas ... référence non définie à QScriptEngine :: newObject ...... et j'ai ajouté #include
@ user568021 Il compile très bien pour moi avec Qt 4.8.2. –
Une solution géniale! Ce serait une belle bibliothèque en-tête seulement, il suffit d'inclure et d'utiliser plutôt toutes les choses de la bibliothèque tout construire avec des dépendances infinies. Quelque chose pour transformer ce QMap en un objet le rendrait parfait. J'ai réussi à faire cela, je vais laisser le code ici pour être utilisé avec votre code. – Jack
Je sais que cette réponse est en retard, mais j'ai récemment créé un projet aider à créer du code qui est destiné à compiler à la fois sur Qt4 et Qt5 et traite avec JSON.
https://code.google.com/p/qjson4/
Cette bibliothèque est en retrait pour être une baisse de remplacement pour QJsonDocument
en Qt4 et utilisera les classes de Qt quand il est utilisé dans QT5. Cela devrait donc être une transition plutôt douce. Ce n'est pas complet à 100%, mais les fonctionnalités principales sont là :-).
Grande réponse que j'ai upvoted. Juste un petit ajout à votre code dans 'QJsonValue.h':' Q_DECLARE_METATYPE (QJsonValue) 'pour rendre cette classe utilisable dans certains cas particuliers. – jonathanzh
Bien sûr, je peux ajouter que :-) –
parsing JSON est désormais pris 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();
Je recommande qjson-backport, car il utilise la même API que dans QT5.
Vous pouvez charger la bibliothèque sous condition lorsque vous utilisez Qt4 et utiliser l'implémentation par défaut lors de l'utilisation de Qt5.
Mon fichier qjson.pri
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
}
Voir [Le meilleur analyseur JSON pour Qt? ] (http://stackoverflow.com/questions/1825892?tab=newest#tab-top). –
J'ai essayé cela, ça n'a pas marché – wael34218
On dirait que Qt5 a des classes JSON. http://qt-project.org/doc/qt-5.0/qtcore/json.html –