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)
问题是输出字符串由于未知原因保持为空。
我检查的事情:
- Json 文档构建正确,实际上包含配置设置
measureJson()
功能正常 returns 输出的大小和 space 正在分配,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,out,strsize);
else serializeJson(doc,out,strsize);
return out;
}
char out[strsize];
这是您的 configSerialize()
函数中的本地 variable/array,一旦您从该函数 return 就无效。
一种方法是在堆上使用 new
和 delete
到 allocate/deallocate space,但我不建议在 Arduino 上这样做。
另一种方法是在函数外部使用 char out[FIXED_SIZE];
- 即作为全局变量。
此外,如果您计划使用 out
作为字符串指针,则需要在末尾添加一个零字节(并为该额外字节分配 space)。
我创建了一个序列化设置的函数,returns一个包含序列化数据的 char*。
首先,我将所有值打包到一个 StaticJsonDocument
中,然后使用 measureJson
确定输出字符串的大小,然后为输出 char out[strsize]
分配 space然后将数据序列化为 space 分配的 serializeJson(doc,out,strsize)
问题是输出字符串由于未知原因保持为空。
我检查的事情:
- Json 文档构建正确,实际上包含配置设置
measureJson()
功能正常 returns 输出的大小和 space 正在分配,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,out,strsize);
else serializeJson(doc,out,strsize);
return out;
}
char out[strsize];
这是您的 configSerialize()
函数中的本地 variable/array,一旦您从该函数 return 就无效。
一种方法是在堆上使用 new
和 delete
到 allocate/deallocate space,但我不建议在 Arduino 上这样做。
另一种方法是在函数外部使用 char out[FIXED_SIZE];
- 即作为全局变量。
此外,如果您计划使用 out
作为字符串指针,则需要在末尾添加一个零字节(并为该额外字节分配 space)。