diff --git a/CHANGELOG.md b/CHANGELOG.md index 2148c6d7..13937981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Fix support for NUL characters in `deserializeJson()` + v7.2.1 (2024-11-15) ------ diff --git a/extras/tests/JsonDeserializer/filter.cpp b/extras/tests/JsonDeserializer/filter.cpp index 4dc2fc6d..894df750 100644 --- a/extras/tests/JsonDeserializer/filter.cpp +++ b/extras/tests/JsonDeserializer/filter.cpp @@ -693,6 +693,15 @@ TEST_CASE("Filtering") { "null", 0, }, + { + "NUL character in key", + "{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}", + "{\"x\\u0000a\":true}", + 10, + DeserializationError::Ok, + "{\"x\\u0000a\":1}", + sizeofObject(1) + sizeofString("x?a"), + }, }; for (auto& tc : testCases) { diff --git a/extras/tests/JsonDeserializer/object.cpp b/extras/tests/JsonDeserializer/object.cpp index ee62ae43..9f0aecb4 100644 --- a/extras/tests/JsonDeserializer/object.cpp +++ b/extras/tests/JsonDeserializer/object.cpp @@ -6,6 +6,7 @@ #include #include "Allocators.hpp" +#include "Literals.hpp" using ArduinoJson::detail::sizeofObject; @@ -322,10 +323,11 @@ TEST_CASE("deserialize JSON object") { SECTION("NUL in keys") { DeserializationError err = - deserializeJson(doc, "{\"x\\u0000a\":1,\"x\\u0000b\":2}"); + deserializeJson(doc, "{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}"); REQUIRE(err == DeserializationError::Ok); - REQUIRE(doc.as() == "{\"x\\u0000a\":1,\"x\\u0000b\":2}"); + REQUIRE(doc.as() == + "{\"x\":0,\"x\\u0000a\":1,\"x\\u0000b\":2}"); } } diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index 459f78af..a4d6c5a6 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -270,10 +270,10 @@ class JsonDeserializer { JsonString key = stringBuilder_.str(); - TFilter memberFilter = filter[key.c_str()]; + TFilter memberFilter = filter[key]; if (memberFilter.allow()) { - auto member = object.getMember(adaptString(key.c_str()), resources_); + auto member = object.getMember(adaptString(key), resources_); if (!member) { // Save key in memory pool. auto savedKey = stringBuilder_.save();