首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用createNestedArray()和ArduinoJson将JsonArray放在JsonObject中?

如何使用createNestedArray()和ArduinoJson将JsonArray放在JsonObject中?
EN

Stack Overflow用户
提问于 2020-02-24 20:56:38
回答 1查看 3.2K关注 0票数 1

我正在尝试通过TCP将JSON-data从ESP32发送到另一个客户端。这种情况应该反复发生。JSON-String包含一个数组。但是,当我尝试使用createNestedArray()函数将一个数组放入JSON文档中时,它会工作几次,直到它开始创建空数组。

最小的代码是:

代码语言:javascript
复制
#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次迭代,输出看起来与预期的一样:

代码语言:javascript
复制
{
  "arrValues": [
    42,
    77
  ]
}
Json-Size: 48

但在那之后,它只发送空数组:

代码语言:javascript
复制
{
  "arrValues": []
}
Json-Size: 16

有人知道为什么它在这一点上突然停止工作了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 09:36:13

首先,在讨论这个问题之前,让我们先讨论一下json对象所需的容量(即大小)。如果使用ArduinoJson Assistant,则json对象

代码语言:javascript
复制
{
  "arrValues": [
    42,
    77
  ]
}

将需要大约58字节(根据json助手的建议,为ESP32分配额外的10字节),因此您分配给doc的3000字节将浪费大量内存,而60字节对于您的json对象来说已经足够。

代码语言:javascript
复制
StaticJsonDocument<60> doc;

现在关于你所描述的问题。你有一个3000字节的StaticJsonDocument doc,并且你不断地将JsonArray root插入到doc中,这就像是将root无限地附加到doc中,所以它迟早会溢出。如果您需要在循环中创建json对象,请将StaticJsonDocument的声明移动到您的循环中,并在需要的时候创建它。

代码语言:javascript
复制
void loop() {
    StaticJsonDocument<60> doc;
    JsonObject root = doc.to<JsonObject>();

    JsonArray arr = root.createNestedArray("arrValues");
    arr.add(42);
    arr.add(77); 
    ...
}

您也可以使用DynamicJsonDocument而不是StaticJsonDocument

代码语言:javascript
复制
    // 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++功能才能有效地使用它,试着花一些时间浏览所有文档。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60376416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档