Open shm4r7 opened 2 days ago
Hi @shm4r7,
Thank you very much for reporting this bug ❤️
I didn't anticipate this use case, and I would need to think this through.
Allowing the caller to pass a JsonArray
or a JsonObject
as the first argument of deserializeJson()
can lead to a mismatch with the actual input. For example, one could write:
deserializeJson(doc.to<JsonObject>(), "[1,2,3]");
In this case, the program expects an object but receives an array; it's not the situation you are in, but the current API allows it to happen. ArduinoJson 7.1 was accidentally working because it was missing the required checks.
I see two ways to handle this situation:
JsonArray
and JsonObject
as the first argumentInvalidInput
when the input type differsI'm currently leaning toward option 1 as it's simpler to implement. Besides, option 2 doesn't bring anything interesting and might be confusing. Option 3 is excluded: I don't want to increase the library size for such a marginal use case.
Meanwhile, pass a JsonVariant
(or a MemberProxy
) instead:
String prepareESPInfo()
{
JsonObject obj = shmartMcuInfoDoc.to<JsonObject>();
auto features = getSupportedShmartFeatures();
- auto featuresObject = obj["features"].to<JsonObject>();
- deserializeJson(featuresObject, features);
+ deserializeJson(obj["features"], features);
serializeJson(shmartMcuInfoDoc, shmartMcuInfo);
return shmartMcuInfo;
}
Best regards, Benoit
Hi @bblanchon,
thank you for detailed explanation, It seems that I unnecesarily complicated thing calling .to<JsonObject>()
. I agree option 1 sounds good, I would prefer to find it at compilation time rather than handle during runtime :)
Regards
Describe the bug
My application crashes when calling
deserializeJson
- it started to happen after upgrade to version 7.2.0, in version 7.1.0 this code worked as I expected.Environment
Here is the environment that I used:
Reproduction
Here is a small snippet that reproduces the issue.
Compiler output
No errors during compilation
Program output
When it crash this is what is logged
And here is a top stack of decoded esp32 exception:
Expected output:
deserializeJson should work as it did in version 7.1.0 without throwing exception