diff --git a/CHANGELOG.md b/CHANGELOG.md index cb0dbbd0..dc7fb739 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion) + v5.1.0 ------ diff --git a/include/ArduinoJson/JsonObject.ipp b/include/ArduinoJson/JsonObject.ipp index 094656c5..8c28193a 100644 --- a/include/ArduinoJson/JsonObject.ipp +++ b/include/ArduinoJson/JsonObject.ipp @@ -55,8 +55,12 @@ inline void JsonObject::remove(JsonObjectKey key) { template inline bool JsonObject::setNodeAt(JsonObjectKey key, T value) { node_type *node = getNodeAt(key.c_str()); - if (!node) node = addNewNode(); - return node && setNodeKey(node, key) && setNodeValue(node, value); + if (!node) { + node = addNewNode(); + if (!node || !setNodeKey(node, key)) + return false; + } + return setNodeValue(node, value); } inline bool JsonObject::setNodeKey(node_type *node, JsonObjectKey key) { diff --git a/test/ArduinoString_Tests.cpp b/test/ArduinoString_Tests.cpp index 1557dd5e..82da09e1 100644 --- a/test/ArduinoString_Tests.cpp +++ b/test/ArduinoString_Tests.cpp @@ -219,3 +219,27 @@ TEST_F(ArduinoStringTests, JsonObject_PrettyPrintTo) { object.prettyPrintTo(json); ASSERT_EQ(String("{\r\n \"key\": \"value\"\r\n}"), json); } + +TEST_F(ArduinoStringTests, JsonBuffer_GrowWhenAddingNewKey) { + JsonObject &object = _jsonBuffer.createObject(); + String key1("hello"), key2("world"); + + object[key1] = 1; + size_t sizeBefore = _jsonBuffer.size(); + object[key2] = 2; + size_t sizeAfter = _jsonBuffer.size(); + + ASSERT_GT(sizeAfter - sizeBefore, key2.size()); +} + +TEST_F(ArduinoStringTests, JsonBuffer_DontGrowWhenReusingKey) { + JsonObject &object = _jsonBuffer.createObject(); + String key("hello"); + + object[key] = 1; + size_t sizeBefore = _jsonBuffer.size(); + object[key] = 2; + size_t sizeAfter = _jsonBuffer.size(); + + ASSERT_EQ(sizeBefore, sizeAfter); +}