Failing to extract value from JSON why?
-
@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...
@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.@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.
@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...
@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? -
@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. -
@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.@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.
@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.
@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 -
@SPlatten said in Failing to extract value from JSON why?:
normally I always check the return of a function, I will revisit this code.
Good. So check if
toString()
returns a null string -- that's your error, as @JonB said.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.
{ "a": "TruE", "b": true }
Suppose
robjRequest
contains the above. Tell us what each of these should return:robjRequest["a"].toArray()
robjRequest["a"].toObject()
robjRequest["a"].toString()
robjRequest["a"].toInt()
robjRequest["a"].toBool()
robjRequest["b"].toArray()
robjRequest["b"].toObject()
robjRequest["b"].toString()
robjRequest["b"].toInt()
robjRequest["b"].toBool()
-
@SPlatten said in Failing to extract value from JSON why?:
normally I always check the return of a function, I will revisit this code.
Good. So check if
toString()
returns a null string -- that's your error, as @JonB said.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.
{ "a": "TruE", "b": true }
Suppose
robjRequest
contains the above. Tell us what each of these should return:robjRequest["a"].toArray()
robjRequest["a"].toObject()
robjRequest["a"].toString()
robjRequest["a"].toInt()
robjRequest["a"].toBool()
robjRequest["b"].toArray()
robjRequest["b"].toObject()
robjRequest["b"].toString()
robjRequest["b"].toInt()
robjRequest["b"].toBool()
-
@JKSH , this is just silly, the name of the function is toSomething, so the name implies that it will convert whatever to the 'something', at least that is exactly how I would code it and expect it to work.
@SPlatten said in Failing to extract value from JSON why?:
@JKSH , this is just silly, the name of the function is toSomething, so the name implies that it will convert whatever to the 'something', at least that is exactly how I would code it and expect it to work.
I don't understand how you expect
toArray()
to work on"TruE"
ortrue
.Consistency in an API is important.
QJsonValue::toArray()
only works on 'something' when that something is an array. Likewise,QJsonValue::toString()
only works on 'something' when that something is a string. -
@SPlatten said in Failing to extract value from JSON why?:
@JKSH , this is just silly, the name of the function is toSomething, so the name implies that it will convert whatever to the 'something', at least that is exactly how I would code it and expect it to work.
I don't understand how you expect
toArray()
to work on"TruE"
ortrue
.Consistency in an API is important.
QJsonValue::toArray()
only works on 'something' when that something is an array. Likewise,QJsonValue::toString()
only works on 'something' when that something is a string. -
@JKSH , this is just silly, the name of the function is toSomething, so the name implies that it will convert whatever to the 'something', at least that is exactly how I would code it and expect it to work.
@SPlatten said in Failing to extract value from JSON why?:
@JKSH , this is just silly, the name of the function is toSomething, so the name implies that it will convert whatever to the 'something', at least that is exactly how I would code it and expect it to work.
No, it isn't that silly, actually it's very much on point.
An API, which is what Qt provides, is a contract (the technical idiom is "Design by contract") - you give us this, and we give you that in exchange. You broke the contract, and you didn't bother to read the contract, and that's all fine with me, but to add insult to injury - you're claiming it's not worth reading the contract. Sorry, that ain't gonna fly!
If you're not up to speed on what I'm babbling about, well the documentation is that contract, if a function name was all and enough we wouldn't bother to write documentation at all.