23
23
#include " qgsrelationmanager.h"
24
24
#include " qgsproject.h"
25
25
#include " qgscsexception.h"
26
+ #include " qgslogger.h"
27
+
28
+ #include < QJsonDocument>
29
+ #include < QJsonArray>
26
30
27
31
QgsJSONExporter::QgsJSONExporter ( const QgsVectorLayer* vectorLayer, int precision )
28
32
: mPrecision( precision )
@@ -246,38 +250,9 @@ QString QgsJSONUtils::encodeValue( const QVariant &value )
246
250
return value.toBool () ? " true" : " false" ;
247
251
248
252
case QVariant::StringList:
249
- {
250
- QStringList input = value.toStringList ();
251
- QStringList output;
252
- Q_FOREACH ( const QString& string, input )
253
- {
254
- output << encodeValue ( string );
255
- }
256
- return output.join ( " ," ).prepend ( ' [' ).append ( ' ]' );
257
- }
258
-
259
253
case QVariant::List:
260
- {
261
- QVariantList input = value.toList ();
262
- QStringList output;
263
- Q_FOREACH ( const QVariant& v, input )
264
- {
265
- output << encodeValue ( v );
266
- }
267
- return output.join ( " ," ).prepend ( ' [' ).append ( ' ]' );
268
- }
269
-
270
254
case QVariant::Map:
271
- {
272
- QMap< QString, QVariant > input = value.toMap ();
273
- QStringList output;
274
- QMap< QString, QVariant >::const_iterator it = input.constBegin ();
275
- for ( ; it != input.constEnd (); ++it )
276
- {
277
- output << encodeValue ( it.key () ) + ' :' + encodeValue ( it.value () );
278
- }
279
- return output.join ( " ,\n " ).prepend ( ' {' ).append ( ' }' );
280
- }
255
+ return QString::fromUtf8 ( QJsonDocument::fromVariant ( value ).toJson ( QJsonDocument::Compact ) );
281
256
282
257
default :
283
258
case QVariant::String:
@@ -309,82 +284,28 @@ QString QgsJSONUtils::exportAttributes( const QgsFeature& feature )
309
284
return attrs.prepend ( ' {' ).append ( ' }' );
310
285
}
311
286
312
-
313
- namespace // TODO: remove when we switch off Qt4
314
- {
315
- void jumpSpace ( const QString& txt, int & i )
316
- {
317
- while ( i < txt.length () && txt.at ( i ).isSpace () ) ++i;
318
- }
319
-
320
- static QString getNextString ( const QString& txt, int & i )
321
- {
322
- jumpSpace ( txt, i );
323
- QString cur = txt.mid ( i );
324
- if ( cur.startsWith ( ' "' ) )
325
- { // quoted element
326
- QRegExp stringRe ( " ^\" ((?:\\\\ .|[^\"\\\\ ])*)\" .*" );
327
- if ( !stringRe.exactMatch ( cur ) )
328
- {
329
- return QString::null;
330
- }
331
- i += stringRe.cap ( 1 ).length () + 2 ;
332
- jumpSpace ( txt, i );
333
- if ( !txt.mid ( i ).startsWith ( ' ,' ) && !txt.mid ( i ).startsWith ( ' ]' ) && i < txt.length () )
334
- {
335
- return QString::null;
336
- }
337
- i += 1 ; // jump the separator
338
-
339
- return stringRe.cap ( 1 )
340
- .replace ( " \\\" " , " \" " )
341
- .replace ( " \\ r" , " \r " )
342
- .replace ( " \\ b" , " \b " )
343
- .replace ( " \\ t" , " \t " )
344
- .replace ( " \\ /" , " /" )
345
- .replace ( " \\ n" , " \n " )
346
- .replace ( " \\\\ " , " \\ " );
347
- }
348
- else
349
- { // unquoted element
350
- QString ret;
351
- int sepPos = cur.indexOf ( ' ,' );
352
- if ( sepPos < 0 ) sepPos = cur.indexOf ( ' ]' );
353
- if ( sepPos < 0 )
354
- {
355
- i += cur.length ();
356
- return cur.trimmed ();
357
- }
358
- i += sepPos + 1 ;
359
- return cur.left ( sepPos ).trimmed ();
360
- }
361
- }
362
- }
363
-
364
287
QVariantList QgsJSONUtils::parseArray ( const QString& json, QVariant::Type type )
365
288
{
366
- // TODO: switch to the Qt parser when we switch off Qt4
289
+ QJsonParseError error;
290
+ const QJsonDocument jsonDoc = QJsonDocument::fromJson ( json.toUtf8 (), &error );
367
291
QVariantList result;
368
- int i = 0 ;
369
- jumpSpace ( json, i );
370
- if ( json.at ( i++ ) != ' [' )
292
+ if ( error.error != QJsonParseError::NoError )
371
293
{
294
+ QgsLogger::warning ( QString ( " Cannot parse json (%1): %2" ).arg ( error.errorString () ).arg ( json ) );
372
295
return result;
373
296
}
374
- while ( i < json. length () )
297
+ if ( !jsonDoc. isArray () )
375
298
{
376
- jumpSpace ( json, i );
377
- if ( json.at ( i ) == ' ]' )
378
- {
379
- return result;
380
- }
381
- const QString value = getNextString ( json, i );
382
- if ( value.isNull () )
383
- {
384
- break ;
385
- }
386
- QVariant variant ( value );
387
- if ( variant.convert ( type ) ) result.append ( variant );
299
+ QgsLogger::warning ( QString ( " Cannot parse json (%1) as array: %2" ).arg ( error.errorString () ).arg ( json ) );
300
+ return result;
301
+ }
302
+ Q_FOREACH ( const QJsonValue cur, jsonDoc.array () )
303
+ {
304
+ QVariant curVariant = cur.toVariant ();
305
+ if ( curVariant.convert ( type ) )
306
+ result.append ( curVariant );
307
+ else
308
+ QgsLogger::warning ( QString ( " Cannot convert json array element: %1" ).arg ( cur.toString () ) );
388
309
}
389
310
return result;
390
311
}
0 commit comments