Функция печати cJSON не добавляет номер к объекту

Я разрабатываю встроенное программное обеспечение на языке C, которое создает строку JSON с несколькими параметрами (строка и целое число). Для своих целей я использовал cJSON), в будущем мне нужно разобрать сложный JSON).

Я строю свой JSON с этим кодом:

  jsonObject = cJSON_CreateObject();

  cJSON_AddNumberToObject( jsonObject, "Version", 1 );

  cJSON_AddStringToObject( jsonObject, "ID", "xyz" );

  cJSON_AddStringToObject( jsonObject, "Local", "1234" );

  cJSON_AddNumberToObject( jsonObject, "Type", 1 );

  cJSON_AddStringToObject( jsonObject, "Message", "Hello" );

Затем я печатаю JSON в динамический буфер, используя:

cJSON_PrintPreallocated( jsonObject, *jsonMessage, *jsonMessageLen, 0 )

Когда я визуализирую jsonMessage на терминале, свойство "Тип" не имеет значения.

Это встроенный JSON:

{"Version":1,"ID":"xyz","Local":"123","Type":,"Message":"Hello"}

Я пытаюсь использовать другой метод печати, например, я использовал:

CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt)

И JSON построен правильно. Проблема в том, что мне нужно выделять память самостоятельно, а не использовать cJSON_PrintBuffered. Это потому что я не могу использовать malloc и free function.

Какие-либо предложения?

Спасибо

2 ответа

Решение

Я обновил модуль cJSON, и теперь он работает нормально.

Это довольно интересно, я думаю, я знаю, что происходит. Приносим извинения за неудобства, вызванные написанием этой ошибки...

В версии 1.4.0 я ввел в cJSON ошибку, заключающуюся в том, что функция, которая печатает числа, не перестала работать, если не смогла выделить достаточно памяти.

print_number будет пытаться выделить 64 байта памяти перед печатью числа, потому что он не знает, сколько байтов sprintf понадобится и snprintf недоступен в ANSI C. Ваш предварительно выделенный буфер, вероятно, был недостаточно длинным для 64 байтов, поэтому он не печатал номер один, но затем продолжал печатать оставшуюся часть JSON в обычном режиме, потому что он не работал (ошибка).

Сегодня я добавил примечание к заголовочному файлу: ваш предварительно выделенный должен быть на 63 байта длиннее, чем вы ожидаете, что будет напечатанный json, если вы хотите избежать какого-либо выхода из ситуации, когда cJSON прерывается, потому что он думает, что ему не хватает память в предварительно выделенном буфере.

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