Fixed deserializeJson() when input contains duplicate keys (fixes #1095)

This commit is contained in:
Benoit Blanchon
2019-09-27 10:01:17 +02:00
parent 713aaa3d68
commit a37480eec9
3 changed files with 14 additions and 6 deletions

View File

@ -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)
-------

View File

@ -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);
}
}

View File

@ -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;