我正在尝试通过TCP将来自ESP32的JSON数据发送到另一个客户端。这应该重复发生。JSON-String包含一个数组。但是,当我尝试使用函数createNestedArray()像Arduino文档示例中那样在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
有谁知道为什么它突然停止工作呢?
首先,在讨论问题之前,让我们先讨论所需的json对象的容量(即大小)。如果您使用ArduinoJson Assistant,则json对象
{
"arrValues": [
42,
77
]
}
大约需要58个字节(如ArduinoJson Assistant所建议的,ESP32需要额外分配10个字节),因此为您分配3000个字节doc
会浪费很多内存,而60个字节就足以满足json对象的目的。
StaticJsonDocument<60> doc;
现在介绍您所描述的问题。您有doc
3000字节的StaticJsonDocument ,并且不断地将JsonArrayroot
插入中doc
,就像将root
infinitely附加到中一样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 ++功能有一点点了解才能有效地使用它,请花一些时间浏览所有文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句