mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 00:32:37 +01:00 
			
		
		
		
	Fixed deserializeJson() when input contains duplicate keys (fixes #1095)
This commit is contained in:
		| @@ -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) | ||||
| ------- | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -130,16 +130,22 @@ 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; | ||||
|  | ||||
|       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(); | ||||
|       if (err) return err;  // Colon | ||||
| @@ -147,7 +153,7 @@ class JsonDeserializer { | ||||
|  | ||||
|       // Parse value | ||||
|       _nestingLimit--; | ||||
|       err = parseVariant(*slot->data()); | ||||
|       err = parseVariant(*variant); | ||||
|       _nestingLimit++; | ||||
|       if (err) return err; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user