【问题标题】:How to create a nested object JSON in arduino如何在 arduino 中创建嵌套对象 JSON
【发布时间】:2019-06-18 05:58:52
【问题描述】:

我正在使用 nrf24l01 网络。我想将来自传感器节点的值(如 id、值 temp、值 湿)存储在 JSON 字符串中,就像这样。 我的字符串:

{ 
    "1": {//this is a ID from node
            "Temp": "value",
            "Humid": "value"
        },
    "2": {
         "Temp": "value",
         "Humid": "value"
     }
}

我可以创建一个对象并从温度和湿度中添加值,但我不知道如何创建“1”/* ID /*

我的代码

void loop() 
{
  network.update();
  if(network.available())
  {
    RF24NetworkHeader header;  
    network.read(header, &pack0, sizeof(pack0));
    if (header.from_node == 1)//this is the ID , return 1, 2, ....
    {
      object["ID"] = header.from_node;
      value["Temperature"] = pack0.temperature;
      value["Humidity"] = pack0.humidity;
      value["Soil"] = pack0.soil;
      serializeJsonPretty(object, Serial);
      Serial.println("");    }
    else if (header.from_node == 2)
    { 
      object["ID"] = header.from_node;
      value["Temperature"] = pack0.temperature;
      value["Humidity"] = pack0.humidity;
      value["Soil"] = pack0.soil; 
      serializeJsonPretty(object, Serial);
      Serial.println("");
    }
  }
}

【问题讨论】:

    标签: c arduino wireless transmission


    【解决方案1】:

    您可以使用createnestedobject,还请记住,您是在循环中创建嵌套的 json 对象,因此您需要注意 Json 文档的大小 (256)。

    编辑:例如当您的嵌套对象超过固定值时,您可以使用clear() 函数清除 JSON 对象。

    #define MAX_ELEMENTS 10
    
    int receive_count = 0;
    StaticJsonDocument<256> doc;
    JsonObject object = doc.to<JsonObject>();
    
    void loop()
    {
        network.update();
        if (network.available())
        {
            RF24NetworkHeader header;
            network.read(header, &pack0, sizeof(pack0));
            if (header.from_node)
            {
                JsonObject ID = object.createNestedObject(String(header.from_node));
                ID["Temperature"] = pack0.temperature;
                ID["Humidity"] = pack0.humidity;
                ID["Soil"] = pack0.soil;
                serializeJsonPretty(object, Serial);
                Serial.println("");
                receive_count++;
                //reset counter if reached and clear object
                if (receive_count >= MAX_ELEMENTS)
                {
                    doc.clear();
                    object = doc.to<JsonObject>();
                    receive_count = 0;
                }
            }
        }
    }
    

    【讨论】:

    • 如果我在循环()之外创建一个嵌套,没关系。当我使用您的代码并在循环()中创建嵌套时,收到 4 个包,第 5 个包是错误的:
      20:18:31.218 -> { 20:18:31.218 -> "1": { 20: 18:31.218 -> "Temperature": 28.5, 20:18:31.253 -> "Humidity": 39 20:18:31.288 -> } //缺少土壤值,第 6 个包为:20:18:34.219 -> { 20:18:34.219 -> "1": {} 20:18:34.219 -> } 缺少所有值。所以我从 256 改为 512,我可以收到 10 个包裹,就像空间不足一样。在我的网络中,我希望它每 10 分钟更新一次值
    • 我可以像这样重置 Json 的数据吗? 1.读取值;
      2.存储在Json中; 3.将它发送到网络(我现在正在使用蚊子和红色节点或firebase。订阅ID然后我可以看到ID.temperature ,...; 4.返回第1步;对不起,我不知道我怎么用格式化 cmt
    • 其实是 doc.clear();但在 clear() 之后;需要再次创建对象。 doc.clear(); object = doc.to&lt;JsonObject&gt;(); receive_count = 0;非常感谢
    • 啊,我的错,我修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多