我正在尝试通过TCP将JSON-data从ESP32发送到另一个客户端。这种情况应该反复发生。JSON-String包含一个数组。但是,当我尝试使用createNestedArray()函数将一个数组放入JSON文档中时,它会工作几次,直到它开始创建空数组。
最小的代码是:
#include "ArduinoJson.h"
StaticJsonDocument<3000> doc;
JsonObject root = doc.to<JsonObject>();
void insertJsonArray(JsonObject root) {
JsonArray arr = root.createNestedArray("arrValues");
arr.add(42);
arr.add(77);
}
void setup() {
Serial.begin(115200);
}
void loop() {
insertJsonArray(root);
// Print values
serializeJsonPretty(root, Serial);
// Print size of Json-Document
Serial.print("Json-Size: ");
Serial.println(root.memoryUsage());
delay(250);
}对于前92次迭代,输出看起来与预期的一样:
{
"arrValues": [
42,
77
]
}
Json-Size: 48但在那之后,它只发送空数组:
{
"arrValues": []
}
Json-Size: 16有人知道为什么它在这一点上突然停止工作了吗?
发布于 2020-02-25 09:36:13
首先,在讨论这个问题之前,让我们先讨论一下json对象所需的容量(即大小)。如果使用ArduinoJson Assistant,则json对象
{
"arrValues": [
42,
77
]
}将需要大约58字节(根据json助手的建议,为ESP32分配额外的10字节),因此您分配给doc的3000字节将浪费大量内存,而60字节对于您的json对象来说已经足够。
StaticJsonDocument<60> doc;现在关于你所描述的问题。你有一个3000字节的StaticJsonDocument doc,并且你不断地将JsonArray root插入到doc中,这就像是将root无限地附加到doc中,所以它迟早会溢出。如果您需要在循环中创建json对象,请将StaticJsonDocument的声明移动到您的循环中,并在需要的时候创建它。
void loop() {
StaticJsonDocument<60> doc;
JsonObject root = doc.to<JsonObject>();
JsonArray arr = root.createNestedArray("arrValues");
arr.add(42);
arr.add(77);
...
}您也可以使用DynamicJsonDocument而不是StaticJsonDocument
// use ArduinoJson Assistant tool to get the capacity
const size_t capacity = JSON_ARRAY_SIZE(2) + JSON_OBJECT_SIZE(1) + 20;
DynamicJsonDocument doc(capacity);
JsonObject root = doc.to<JsonObject>();
JsonArray arr = root.createNestedArray("arrValues");
arr.add(42);
arr.add(77); ArduinoJson是一个强大的库,但它需要更好地理解C++功能才能有效地使用它,试着花一些时间浏览所有文档。
https://stackoverflow.com/questions/60376416
复制相似问题