easiest way to parse JSON in Qt 4.7

后端 未结 6 2034
甜味超标
甜味超标 2020-12-13 09:44

I need to parse JSON object through Qt. What is the easiest/fastest way to do it?

6条回答
  •  醉话见心
    2020-12-13 10:20

    Here is Qt style json encoder/decoder

    #include "json.h"
    
    #include 
    #include 
    
    Json::Json()
    {
    }
    
    
    QString Json::encode(const QMap &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 Json::decode(const QString &jsonStr)
    {
        QScriptValue object;
        QScriptEngine engine;
        object = engine.evaluate("(" + jsonStr + ")");
        return decodeInner(object);
    }
    
    QScriptValue Json::encodeInner(const QMap &map, QScriptEngine* engine)
    {
        QScriptValue obj = engine->newObject();
        QMapIterator 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 Json::decodeInner(QScriptValue object)
    {
        QMap 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 Json::decodeInnerToList(QScriptValue arrayValue)
    {
        QList 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;
    }
    

提交回复
热议问题