From a37480eec9664989fdb62aed54a66006110ce6bd Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 27 Sep 2019 10:01:17 +0200 Subject: [PATCH] Fixed deserializeJson() when input contains duplicate keys (fixes #1095) --- CHANGELOG.md | 1 + extras/tests/JsonDeserializer/object.cpp | 1 + src/ArduinoJson/Json/JsonDeserializer.hpp | 18 ++++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0178893..5def537c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ HEAD * Added support for custom writer classes (issue #1088) * Added conversion from `JsonArray` and `JsonObject` to `bool`, to be consistent with `JsonVariant` +* Fixed `deserializeJson()` when input contains duplicate keys (issue #1095) v6.12.0 (2019-09-05) ------- diff --git a/extras/tests/JsonDeserializer/object.cpp b/extras/tests/JsonDeserializer/object.cpp index 739f6d6d..f07c550c 100644 --- a/extras/tests/JsonDeserializer/object.cpp +++ b/extras/tests/JsonDeserializer/object.cpp @@ -277,6 +277,7 @@ TEST_CASE("deserialize JSON object") { DeserializationError err = deserializeJson(doc, "{a:{b:{c:1}},a:2}"); REQUIRE(err == DeserializationError::Ok); + REQUIRE(doc["a"] == 2); } } diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index 63bc860b..3f08d0bf 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -130,15 +130,21 @@ class JsonDeserializer { // Read each key value pair for (;;) { - // Allocate slot in object - VariantSlot *slot = object.addSlot(_pool); - if (!slot) return DeserializationError::NoMemory; - // Parse key const char *key; err = parseKey(key); if (err) return err; - slot->setOwnedKey(make_not_null(key)); + + VariantData *variant = object.get(adaptString(key)); + if (!variant) { + // Allocate slot in object + VariantSlot *slot = object.addSlot(_pool); + if (!slot) return DeserializationError::NoMemory; + + slot->setOwnedKey(make_not_null(key)); + + variant = slot->data(); + } // Skip spaces err = skipSpacesAndComments(); @@ -147,7 +153,7 @@ class JsonDeserializer { // Parse value _nestingLimit--; - err = parseVariant(*slot->data()); + err = parseVariant(*variant); _nestingLimit++; if (err) return err;