///////////////////////////////////////////////////////////////////////////////// // // 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.toLatin1() ); file.write( byteArray ); } file.close(); } #endif QString Json::encode( const QMap& map, bool prettify ) { QScriptEngine engine; if ( prettify ) { engine.evaluate( "function toString() { return JSON.stringify(this, null, ' ') }" ); } else { 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; } } // namespace ResInsightInternalJson