///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2011-2013 Statoil ASA, Ceetron AS // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// // Json parser based on code example found on: // http://stackoverflow.com/questions/4169988/easiest-way-to-parse-json-in-qt-4-7 #include "RifJsonEncodeDecode.h" #include #include #include #include namespace ResInsightInternalJson { QMap JsonReader::decodeFile(QString filePath) { QFile file; file.setFileName(filePath); file.open(QIODevice::ReadOnly); QByteArray byteArray = file.readAll(); file.close(); QString jsonString(byteArray); Json json; return json.decode(jsonString); } #if IMPL_DUMP_TO_FILE void JsonReader::dumpToFile(std::vector& points, QString filePath) { QFile file; file.setFileName(filePath); file.open(QIODevice::WriteOnly); for (size_t idx = 0; idx < points.size(); idx++) { cvf::Vec3d point = points[idx]; QString string; string.sprintf("(%0.10e, %0.10e, %0.10e)\n", point.x(), point.y(), point.z()); QByteArray byteArray(string.toAscii()); file.write(byteArray); } file.close(); } #endif 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; } } // end ResInsightInternalJson