mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-09-25 22:40:56 +02:00
Clone an object or an array
@@ -401,35 +401,35 @@ Throwing<DynamicJsonBuffer> jsonBuffer;
|
|||||||
|
|
||||||
See issue [#205](https://github.com/bblanchon/ArduinoJson/issues/205).
|
See issue [#205](https://github.com/bblanchon/ArduinoJson/issues/205).
|
||||||
|
|
||||||
## Reuse JsonBuffer
|
## Clone an object or an array
|
||||||
|
|
||||||
:warning: **JsonBuffer are designed to be non reusable.**
|
|
||||||
|
|
||||||
:warning: **This is on purpose and this is actually here to help!**
|
|
||||||
|
|
||||||
:warning: **It prevents memory leaks and dangling pointer.**
|
|
||||||
|
|
||||||
:warning: **This section is only intended to insane people who deliberately ignores the recommendation of the library author.**
|
|
||||||
|
|
||||||
:warning: [READ THE FAQ BEFORE USING THIS!!!!!!!](https://bblanchon.github.io/ArduinoJson/faq/how-to-reuse-a-jsonbuffer/)
|
|
||||||
|
|
||||||
|
|
||||||
Here is how you can write your own `clear()` function:
|
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
template<typename T>
|
JsonVariant clone(JsonBuffer& jb, JsonVariant prototype)
|
||||||
void clear(T& instance)
|
|
||||||
{
|
{
|
||||||
instance = T();
|
if (prototype.is<JsonObject>()) {
|
||||||
|
const JsonObject& protoObj = prototype;
|
||||||
|
JsonObject& newObj = jb.createObject();
|
||||||
|
for (const auto& kvp : protoObj) {
|
||||||
|
newObj[kvp.key] = clone(jb, kvp.value);
|
||||||
|
}
|
||||||
|
return newObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prototype.is<JsonArray>()) {
|
||||||
|
const JsonArray& protoArr = prototype;
|
||||||
|
JsonArray& newArr = jb.createArray();
|
||||||
|
for (const auto& elem : protoArr) {
|
||||||
|
newArr.add(clone(jb, elem));
|
||||||
|
}
|
||||||
|
return newArr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prototype.is<char*>()) {
|
||||||
|
return jb.strdup(prototype.as<char*>());
|
||||||
|
}
|
||||||
|
|
||||||
|
return prototype;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
To use it in your code:
|
See issue [#533](https://github.com/bblanchon/ArduinoJson/issues/533)
|
||||||
|
|
||||||
```c++
|
|
||||||
clear(jsonBuffer);
|
|
||||||
```
|
|
||||||
|
|
||||||
See issues [#72](https://github.com/bblanchon/ArduinoJson/issues/72), [#115](https://github.com/bblanchon/ArduinoJson/issues/115), [#141](https://github.com/bblanchon/ArduinoJson/issues/141)
|
|
||||||
|
|
||||||
See [ArduinoJson: Avoiding pitfalls](https://bblanchon.github.io/ArduinoJson/doc/pitfalls/#4-dont-reuse-the-same-jsonbuffer)
|
|
Reference in New Issue
Block a user