Сериализация ArduinoJSON возвращает пустую строку при сериализации в char*
Я сделал функцию, которая сериализует настройки и возвращает 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,out,strsize);
else serializeJson(doc,out,strsize);
return out;
}
1 ответ
char out[strsize];
Это локальная переменная / массив внутри вашего configSerialize()
функция и недействительна после возврата из этой функции.
Один из способов - использовать new
а также delete
для выделения / освобождения места в куче, но я бы не рекомендовал это на Arduino.
Другой способ - использовать char out[FIXED_SIZE];
вне вашей функции - то есть как глобальная переменная.
Кроме того, если вы планируете использовать out
в качестве указателя на строку вам нужно добавить нулевой байт в конце (и выделить место для этого дополнительного байта).