Failing to extract value from JSON why?
-
wrote on 10 Dec 2020, 13:54 last edited by
I've been using the various JSON objects for a while now, but I I'm failing to see why I cannot extract the value from this:
robjRequest is a reference to an instance of QJsonObject, in the debugger it shows:
robjRequest: > [0] "commands". <16 items> > [1] "file" "~/XMLMPAM/config/test.dat" > [2] "module". "mdFileIO" > [3] "position". 1
I want to locate and extract position:
QJsonObject::iterator itrFound = robjRequest.find(clsModFileIO::mscszPosition); if ( itrFound != robjRequest.end() ) { QString strLastKnown(itrFound.value().toString()); qint64LastKnown = static_cast<qint64>(strLastKnown.toInt()); }
mscszPosition is defined as:
const char clsModFileIO::mscszPosition[] = "position";
I've stepped into the if condition and 'itrFound' is not equal to end so it has found the position, but the line to extract the value doesn't work, strLastKnown is "".
Why could this be?
-
I've been using the various JSON objects for a while now, but I I'm failing to see why I cannot extract the value from this:
robjRequest is a reference to an instance of QJsonObject, in the debugger it shows:
robjRequest: > [0] "commands". <16 items> > [1] "file" "~/XMLMPAM/config/test.dat" > [2] "module". "mdFileIO" > [3] "position". 1
I want to locate and extract position:
QJsonObject::iterator itrFound = robjRequest.find(clsModFileIO::mscszPosition); if ( itrFound != robjRequest.end() ) { QString strLastKnown(itrFound.value().toString()); qint64LastKnown = static_cast<qint64>(strLastKnown.toInt()); }
mscszPosition is defined as:
const char clsModFileIO::mscszPosition[] = "position";
I've stepped into the if condition and 'itrFound' is not equal to end so it has found the position, but the line to extract the value doesn't work, strLastKnown is "".
Why could this be?
wrote on 10 Dec 2020, 14:10 last edited by KroMignon 12 Oct 2020, 14:44@SPlatten said in Failing to extract value from JSON why?:
I want to locate and extract position:
Why you don't use
robjRequest.value(clsModFileIO::mscszPosition)
?EDIT: As far as I can see, position is not a string but an integer so
toString()
will not work and return an empty string! You should usetoInt()
-
wrote on 10 Dec 2020, 14:52 last edited by
QJsonValueRef::toString(const QString &defaultValue) returns the defaultValue when the QJsonValueRef is not a string (an empty string in your case).
You might want to use isString() to confirm it is indeed a string.
It seems "position" is actually an integer, so use toInt() to fetch it. -
@SPlatten said in Failing to extract value from JSON why?:
I want to locate and extract position:
Why you don't use
robjRequest.value(clsModFileIO::mscszPosition)
?EDIT: As far as I can see, position is not a string but an integer so
toString()
will not work and return an empty string! You should usetoInt()
wrote on 10 Dec 2020, 15:47 last edited by@KroMignon isn’t the purpose of toString to convert the value to a string?
-
QJsonValueRef::toString(const QString &defaultValue) returns the defaultValue when the QJsonValueRef is not a string (an empty string in your case).
You might want to use isString() to confirm it is indeed a string.
It seems "position" is actually an integer, so use toInt() to fetch it. -
wrote on 10 Dec 2020, 15:52 last edited by JonB 12 Oct 2020, 15:56
@SPlatten
No, why not always read the docs? QString QJsonValue::toString() constConverts the value to a QString and returns it.
If type() is not String, a null QString will be returned.
This function concerns the type of the value in the JSON, not what other type you might want to convert it to. Use QJsonValue::Type QJsonValue::type() const if you want to know the type of the value.
I wouldn't recommend it, but
QJsonValue::toVariant().toString()
would do what you wanted. -
wrote on 10 Dec 2020, 15:54 last edited by
@SPlatten said in Failing to extract value from JSON why?:
again I would expect toString to convert the type of the value to a string.
You are wrong, the JSON you have create defines "position" as an integer
{ "position" : 1 }
and not as a string{ "position" : "1" }
.
QJsonObject.value() returns a QJsonValue and, as written in documentation:QString QJsonValue::toString() const
Converts the value to a QString and returns it.
If type() is not String, a null QString will be returned. -
@KroMignon isn’t the purpose of toString to convert the value to a string?
@SPlatten said in Failing to extract value from JSON why?:
isn’t the purpose of toString to convert the value to a string?
The purpose of a function is to do what's documented... but I know reading documentation just takes too long...
-
@SPlatten said in Failing to extract value from JSON why?:
isn’t the purpose of toString to convert the value to a string?
The purpose of a function is to do what's documented... but I know reading documentation just takes too long...
wrote on 10 Dec 2020, 19:44 last edited by@Christian-Ehrlicher oh... my sides... so funny!
-
@SPlatten said in Failing to extract value from JSON why?:
again I would expect toString to convert the type of the value to a string.
You are wrong, the JSON you have create defines "position" as an integer
{ "position" : 1 }
and not as a string{ "position" : "1" }
.
QJsonObject.value() returns a QJsonValue and, as written in documentation:QString QJsonValue::toString() const
Converts the value to a QString and returns it.
If type() is not String, a null QString will be returned.wrote on 10 Dec 2020, 19:46 last edited by@KroMignon yes, i realise that but the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
-
@KroMignon yes, i realise that but the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
wrote on 10 Dec 2020, 21:01 last edited by@SPlatten said in Failing to extract value from JSON why?:
yes, i realise that but the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
As always with Qt, there is a very good documentation.
Your first reflex should be to look there if the function does what you expect. It takes seconds and saves hours. -
@SPlatten said in Failing to extract value from JSON why?:
isn’t the purpose of toString to convert the value to a string?
The purpose of a function is to do what's documented... but I know reading documentation just takes too long...
wrote on 10 Dec 2020, 21:50 last edited by@Christian-Ehrlicher said in Failing to extract value from JSON why?:
The purpose of a function is to do what's documented... but I know reading documentation just takes too long...
lol, TLDR RTFM!
-
@KroMignon yes, i realise that but the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
@SPlatten said in Failing to extract value from JSON why?:
the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
Following that logic, would you also always expect
QJsonValue::toArray()
to convert your value to an array, andQJsonValue::toObject()
to convert your value to an object, andQJsonValue::toInt()
to convert your value to an integer? Even if the value is not an array or an object or a number? -
@SPlatten said in Failing to extract value from JSON why?:
the name of the function is toString, so I expect the result to be whatever is on the left converted to a string.
Following that logic, would you also always expect
QJsonValue::toArray()
to convert your value to an array, andQJsonValue::toObject()
to convert your value to an object, andQJsonValue::toInt()
to convert your value to an integer? Even if the value is not an array or an object or a number? -
wrote on 11 Dec 2020, 11:18 last edited by JonB 12 Nov 2020, 11:19
@SPlatten
I'm not criticizing you, just making an observation. It did report an error. But it reported an error by thetoString()
return a nullQString()
, which is an invalid string, for you to check for, rather than a "message"/"exception". Which is the Qt library way of returning errors. -
wrote on 11 Dec 2020, 11:19 last edited by
@SPlatten said in Failing to extract value from JSON why?:
if it couldn't then I would expect an error.
Qt is avoiding exception usage, so what kind of error did you expect?
And you should not expect to much but simply some time hit the F1 key on your keyboard to get the help for the function. All is documentation, you only have to read it. -
@SPlatten
I'm not criticizing you, just making an observation. It did report an error. But it reported an error by thetoString()
return a nullQString()
, which is an invalid string, for you to check for, rather than a "message"/"exception". Which is the Qt library way of returning errors. -
@SPlatten said in Failing to extract value from JSON why?:
if it couldn't then I would expect an error.
Qt is avoiding exception usage, so what kind of error did you expect?
And you should not expect to much but simply some time hit the F1 key on your keyboard to get the help for the function. All is documentation, you only have to read it.wrote on 11 Dec 2020, 11:24 last edited by@KroMignon , Why is Qt avoid exception usage, if there is an error then there should be a mechanism for finding out what was wrong.
-
@KroMignon , Why is Qt avoid exception usage, if there is an error then there should be a mechanism for finding out what was wrong.
wrote on 11 Dec 2020, 11:33 last edited by JonB 12 Nov 2020, 11:36@SPlatten
The answer is to this is historical/per language. C, and then C++, used function return results to indicate errors, not exceptions. (Exceptions are regarded as "expensive" in C++, but that's only one reason.) It's not always true now --- some C++ libraries do use exceptions --- but plenty stick with that approach. Qt is just following that pattern, which is not unreasonable for C++. Some other languages, e.g. C# or Python, tend to raise exceptions, as you prefer. That's just how it is. -
@KroMignon , Why is Qt avoid exception usage, if there is an error then there should be a mechanism for finding out what was wrong.
wrote on 11 Dec 2020, 11:39 last edited by@SPlatten said in Failing to extract value from JSON why?:
Why is Qt avoid exception usage
Again, this is documented ;)
https://wiki.qt.io/Coding_Conventions
https://doc.qt.io/qt-5/exceptionsafety.html
1/25