序列化为char *时,ArduinoJSON序列化返回空字符串

我做了一个可以序列化设置并返回包含序列化数据的char *的函数。

首先,我将所有值打包到StaticJsonDocument中,然后使用measureJson确定输出字符串的大小,然后为输出char out[strsize]分配空间,然后将数据序列化为空间已分配serializeJson(doc,out,strsize)

问题是输出字符串由于未知原因而为空。

我检查过的事情:

  • Json文档结构正确,实际上包含配置设置
  • measureJson()函数正确返回输出的大小并正在分配空间,strsize不为0

代码:

char* configSerialize(bool msgpack){

  StaticJsonDocument<settsize> doc;

  JsonArray ipk = doc.createnestedArray("ip");
  JsonArray gateipk = doc.createnestedArray("gateip");
  JsonArray dnsk = doc.createnestedArray("dns");
  JsonArray mack = doc.createnestedArray("mac");

  unsigned char i;
  for(i=0;i<4;i++){
    ipk.add(ip[i]);
    gateipk.add(gateip[i]);
    dnsk.add(dns[i]);
  }
  for(i=0;i<6;i++){
    mack.add(mac[i]);
  }

  doc["subnet"] = subnet;
  doc["dhcp"] = DHCP;
  doc["alertbuzz"] = alertbuzz;

  const size_t strsize = msgpack ? measureMsgPack(doc) : measureJson(doc);
  char out[strsize];

  if(msgpack) serializeMsgPack(doc,strsize);
  else serializeJson(doc,strsize);

  return out;

}
lorndrifter 回答:序列化为char *时,ArduinoJSON序列化返回空字符串

char out[strsize];

这是configSerialize()函数内部的局部变量/数组,一旦从该函数返回,该变量/数组将无效。

一种方法是使用newdelete在堆上分配/释放空间,但是我不建议在Arduino上使用。

另一种方法是在函数之外使用char out[FIXED_SIZE];-即作为全局变量。

此外,如果您打算使用out作为字符串指针,则需要在末尾添加一个零字节(并为该额外的字节分配空间)。

本文链接:https://www.f2er.com/2607867.html

大家都在问