From a9560414953da48d3835592e01280d1bcb996221 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 28 May 2024 13:12:24 +1000 Subject: [PATCH] [sensorthings] Handle array results from Observations Fixes #57577 --- .../qgssensorthingsshareddata.cpp | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/src/core/providers/sensorthings/qgssensorthingsshareddata.cpp b/src/core/providers/sensorthings/qgssensorthingsshareddata.cpp index eb55fad7110..a209051c756 100644 --- a/src/core/providers/sensorthings/qgssensorthingsshareddata.cpp +++ b/src/core/providers/sensorthings/qgssensorthingsshareddata.cpp @@ -475,25 +475,54 @@ bool QgsSensorThingsSharedData::processFeatureRequest( QString &nextPage, QgsFee if ( !json.contains( tag ) ) return QVariant(); - const auto &jObj = json[tag]; - if ( jObj.is_number_integer() ) + std::function< QString( const basic_json<> &obj, bool &ok ) > objToString; + objToString = [&objToString]( const basic_json<> &obj, bool & ok ) -> QString { - return QString::number( jObj.get() ); - } - else if ( jObj.is_number_unsigned() ) - { - return QString::number( jObj.get() ); - } - else if ( jObj.is_boolean() ) - { - return QString::number( jObj.get() ); - } - else if ( jObj.is_number_float() ) - { - return QString::number( jObj.get() ); - } + ok = true; + if ( obj.is_number_integer() ) + { + return QString::number( obj.get() ); + } + else if ( obj.is_number_unsigned() ) + { + return QString::number( obj.get() ); + } + else if ( obj.is_boolean() ) + { + return QString::number( obj.get() ); + } + else if ( obj.is_number_float() ) + { + return QString::number( obj.get() ); + } + else if ( obj.is_array() ) + { + QStringList results; + results.reserve( obj.size() ); + for ( const auto &item : obj ) + { + bool itemOk = false; + const QString itemString = objToString( item, itemOk ); + if ( itemOk ) + results.push_back( itemString ); + } + return results.join( ',' ); + } + else if ( obj.is_string() ) + { + return QString::fromStdString( obj.get() ); + } - return QString::fromStdString( json[tag].get() ); + ok = false; + return QString(); + }; + + const auto &jObj = json[tag]; + bool ok = false; + const QString r = objToString( jObj, ok ); + if ( ok ) + return r; + return QVariant(); }; auto getDateTime = []( const basic_json<> &json, const char *tag ) -> QVariant