ArduinoJSON 序列化 returns 序列化为 char* 时为空字符串

ArduinoJSON serialization returns an empty string when serializing to char*

我创建了一个序列化设置的函数,returns一个包含序列化数据的 char*。

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

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

我检查的事情:

代码:

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,out,strsize);
  else serializeJson(doc,out,strsize);

  return out;

}
char out[strsize];

这是您的 configSerialize() 函数中的本地 variable/array,一旦您从该函数 return 就无效。

一种方法是在堆上使用 newdelete 到 allocate/deallocate space,但我不建议在 Arduino 上这样做。

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

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