Unsolved Failing to extract value from JSON why?
-
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?
-
@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()
-
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. -
@KroMignon isn’t the purpose of toString to convert the value to a string?
-
@Charby , again I would expect toString to convert the type of the value to a string.
-
@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. -
@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. -
@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...
-
@Christian-Ehrlicher oh... my sides... so funny!
-
@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?:
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. -
@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!
-
@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? -
@JKSH , of course, and if it couldn't then I would expect an error.
-
@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. -
@JonB normally I always check the return of a function, I will revisit this code.
-
@KroMignon , Why is Qt avoid exception usage, if there is an error then there should be a mechanism for finding out what was wrong.
-
@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. -
@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