Ho bisogno di analizzare l'oggetto JSON tramite Qt. Qual è il modo più semplice/veloce per farlo?Il modo più semplice per analizzare JSON in Qt 4.7
risposta
Prova QJson.
QJson è attivamente sviluppato (e utilizzato da KDE, se non mi sbaglio). La cosa migliore è controllare il codice sorgente direttamente e crearlo da solo. Non ci sono dipendenze da QJson (eccetto Qt e CMake). E 'piuttosto semplice da usare anche, hanno uno sguardo ad alcuni esempi di utilizzo:
Se non si vuole dipendere da librerie esterne è possibile utilizzare il QScriptEngine
http://qtwiki.remdex.info/Parsing_JSON_with_QT_using_standard_QT_library
obsolescenza dei link. Da qualche dominio casuale "info". Grazie per niente. – o9000
Qui Qt style json encoder/decodificatore
#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;
}
Sembra molto bello ... ma non compila ... riferimento non definito a QScriptEngine :: newObject ...... e ho aggiunto #include
@ user568021 Compilare bene per me con Qt 4.8.2. –
Impressionante soluzione! Sarebbe una bella libreria di sola intestazione, solo include-and-use piuttosto tutta la cosa della libreria di build con dipendenze infinite. Qualcosa per trasformare QMap in un oggetto lo renderebbe perfetto. Sono riuscito a farlo lascerò qui il codice da utilizzare con il tuo codice. – Jack
So che questa risposta è in ritardo, ma di recente ho creato un progetto per aiuta a creare codice che è pensato per compilare sia su Qt4 che su Qt5 e si occupa di JSON.
https://code.google.com/p/qjson4/
Questa libreria è rientrato per essere un rimpiazzo per QJsonDocument
in Qt4 e userà le classi di Qt quando usato in QT5. Quindi dovrebbe essere una transizione abbastanza liscia. Non è completo al 100%, ma le caratteristiche principali sono lì :-).
Ottima risposta che ho svalutato. Solo una piccola aggiunta al tuo codice in 'QJsonValue.h':' Q_DECLARE_METATYPE (QJsonValue) 'per rendere questa classe utilizzabile in alcuni casi speciali. – jonathanzh
Certo, posso aggiungere che :-) –
JSON analisi è ora supportato in Qt 5. Ecco come caricare e analizzare un documento:
#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();
Suggerirei qjson-backport, in quanto utilizza la stessa API come in QT5.
È possibile caricare la libreria con condizionamento quando si utilizza Qt4 e utilizzare l'implementazione predefinita quando si utilizza Qt5.
Il mio file qjson.pri
assomiglia:
!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
}
- 1. Qual è il modo più semplice per analizzare JSON in Scala?
- 2. modo più semplice per analizzare una data in Javascript
- 3. Il modo più efficiente per analizzare Xml
- 4. Qual è il modo più semplice per analizzare JSON usando gson quando l'elemento da analizzare è un elemento di una stringa json?
- 5. Client TCP QT più semplice
- 6. Il modo migliore/più semplice per analizzare i parametri di configurazione in Sh/Bash e php
- 7. Qual è il modo più semplice per analizzare i numeri in clojure?
- 8. Il modo più semplice per disegnare un'immagine?
- 9. Qual è il modo più veloce per analizzare una stringa JSON in una tabella SQLite?
- 10. Il miglior parser JSON per Qt?
- 11. Qual è il modo più semplice per convertire JSON in BSON in .net world
- 12. Il modo più semplice per rimuovere le relazioni ricorsive bidirezionali?
- 13. il modo più semplice per incorporare Perl in html
- 14. Il modo più semplice per scrivere e leggere un XML
- 15. Il modo più semplice per chiamare più AuthenticationSuccessHandlers?
- 16. Swift: il modo più veloce per analizzare HTML
- 17. Il modo più semplice per rm -rf in Python
- 18. Il modo più semplice per confrontare gli array in C#
- 19. Il modo più semplice per sommare due elenchi in Scala?
- 20. Il modo più semplice per convertire in booleano
- 21. Il modo più semplice per incrementare una data in PHP?
- 22. Il modo più semplice per forzare un arresto in Swift
- 23. Il modo più semplice per leggere l'input formattato in C++?
- 24. Il modo più semplice per risolvere equazioni matematiche in Python
- 25. Il modo più semplice per trasformare la raccolta in array?
- 26. Il modo più semplice per eliminare NULL in SELECT DISTINCT?
- 27. Il modo più semplice per scambiare due file in bash
- 28. Il modo più efficace per correggere un JSON non valido
- 29. Qt: semplice esempio per Quazip
- 30. Qual è il modo migliore per analizzare il formato JSON in iOS Swift?
See [Best JSON parser per Qt? ] (http://stackoverflow.com/questions/1825892?tab=newest#tab-top). –
L'ho provato, non funzionava – wael34218
Sembra che Qt5 abbia alcune classi JSON. http://qt-project.org/doc/qt-5.0/qtcore/json.html –