qjsondocument qjsonarray json qt parsing qt4 qjson

qjsonarray - qjsonobject qt



forma más fácil de analizar JSON en Qt 4.7 (6)

Aquí está el codificador / decodificador jt estilo 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; }

Necesito analizar el objeto JSON a través de Qt. ¿Cuál es la forma más fácil / rápida de hacerlo?


El análisis JSON ahora se admite en Qt 5. Aquí se explica cómo cargar y analizar 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();


Prueba QJson .

QJson está activamente desarrollado (y utilizado por KDE, si no me equivoco). Lo mejor es verificar el código fuente directamente y compilarlo usted mismo. No hay dependencias con QJson (excepto Qt y CMake). También es bastante fácil de usar, eche un vistazo a algunos ejemplos de uso:

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


Recomendaría qjson-backport , ya que usa la misma API que en Qt5.

Puede cargar la biblioteca condicionalmente cuando usa Qt4, y usar la implementación predeterminada cuando usa Qt5.

Mi archivo qjson.pri ve así:

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


Sé que esta respuesta es tardía, pero recientemente creé un proyecto para ayudar a crear código que pretende compilar tanto Qt4 como Qt5 y trata sobre JSON.

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

Esta biblioteca está sangrada para reemplazar a QJsonDocument en Qt4 y usará las clases de Qt cuando se use en Qt5. Entonces debería ser una transición bastante suave. No está 100% completo, pero las principales características están ahí :-).