1
0
mirror of https://github.com/qgis/QGIS.git synced 2025-04-15 00:04:00 -04:00

improve value conversion to json-string

This commit is contained in:
signedav 2018-12-20 10:34:58 +01:00
parent 9ff514b9be
commit ebb25e6b49
3 changed files with 15 additions and 12 deletions

@ -44,5 +44,5 @@ QgsEditorConfigWidget *QgsListWidgetFactory::configWidget( QgsVectorLayer *vl, i
unsigned int QgsListWidgetFactory::fieldScore( const QgsVectorLayer *vl, int fieldIdx ) const unsigned int QgsListWidgetFactory::fieldScore( const QgsVectorLayer *vl, int fieldIdx ) const
{ {
const QgsField field = vl->fields().field( fieldIdx ); const QgsField field = vl->fields().field( fieldIdx );
return ( field.type() == QVariant::List || field.type() == QVariant::StringList || field.typeName().compare( QLatin1String( "json" ), Qt::CaseInsensitive ) == 0 || field.typeName() == QLatin1String( "jsonb" ) ) && field.subType() != QVariant::Invalid ? 20 : 0; return ( field.type() == QVariant::List || field.type() == QVariant::StringList || QVariant::Map ) && field.subType() != QVariant::Invalid ? 20 : 0;
} }

@ -1408,14 +1408,17 @@ OGRGeometryH QgsOgrProvider::ConvertGeometryIfNecessary( OGRGeometryH hGeom )
return OGR_G_ForceTo( hGeom, layerGeomType, nullptr ); return OGR_G_ForceTo( hGeom, layerGeomType, nullptr );
} }
QString QgsOgrProvider::jsonStringValue( const QVariant &value ) QString QgsOgrProvider::jsonStringValue( const QVariant &value, const QVariant::Type &type )
{ {
QString stringValue = QString::fromUtf8( QJsonDocument::fromVariant( value.toMap() ).toJson().data() ); switch ( type )
if ( stringValue == QStringLiteral( "{\n}\n" ) ) {
stringValue = QString::fromUtf8( QJsonDocument::fromVariant( value.toList() ).toJson().data() ); case QVariant::Map:
if ( stringValue == QStringLiteral( "[\n]\n" ) && !value.toString().isEmpty() ) return QString::fromUtf8( QJsonDocument::fromVariant( value.toMap() ).toJson().data() );
stringValue = value.toString(); case QVariant::List:
return stringValue; return QString::fromUtf8( QJsonDocument::fromVariant( value.toList() ).toJson().data() );
default:
return value.toString();
}
} }
bool QgsOgrProvider::addFeaturePrivate( QgsFeature &f, Flags flags ) bool QgsOgrProvider::addFeaturePrivate( QgsFeature &f, Flags flags )
@ -1547,7 +1550,7 @@ bool QgsOgrProvider::addFeaturePrivate( QgsFeature &f, Flags flags )
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,4,0) #if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,4,0)
if ( OGR_Fld_GetSubType( fldDef ) == OFSTJSON ) if ( OGR_Fld_GetSubType( fldDef ) == OFSTJSON )
stringValue = jsonStringValue( attrVal ); stringValue = jsonStringValue( attrVal, attrVal.type() );
else else
{ {
stringValue = attrVal.toString(); stringValue = attrVal.toString();
@ -2136,7 +2139,7 @@ bool QgsOgrProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
QString stringValue; QString stringValue;
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,4,0) #if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,4,0)
if ( OGR_Fld_GetSubType( fd ) == OFSTJSON ) if ( OGR_Fld_GetSubType( fd ) == OFSTJSON )
stringValue = jsonStringValue( it2.value() ); stringValue = jsonStringValue( it2.value(), it2->type() );
else else
stringValue = it2->toString(); stringValue = it2->toString();
#else #else

@ -284,8 +284,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
mutable QStringList mSubLayerList; mutable QStringList mSubLayerList;
//! convert from json QVariant to QString //! converts \a value from json QVariant to QString regarding to \a type
QString jsonStringValue( const QVariant &value ); QString jsonStringValue( const QVariant &value, const QVariant::Type &type );
bool addFeaturePrivate( QgsFeature &f, QgsFeatureSink::Flags flags ); bool addFeaturePrivate( QgsFeature &f, QgsFeatureSink::Flags flags );
//! Deletes one feature //! Deletes one feature