Сериализация 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 в качестве указателя на строку вам нужно добавить нулевой байт в конце (и выделить место для этого дополнительного байта).

Другие вопросы по тегам