Функция печати 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 ответа
Это довольно интересно, я думаю, я знаю, что происходит. Приносим извинения за неудобства, вызванные написанием этой ошибки...
В версии 1.4.0 я ввел в cJSON ошибку, заключающуюся в том, что функция, которая печатает числа, не перестала работать, если не смогла выделить достаточно памяти.
print_number
будет пытаться выделить 64 байта памяти перед печатью числа, потому что он не знает, сколько байтов sprintf
понадобится и snprintf
недоступен в ANSI C. Ваш предварительно выделенный буфер, вероятно, был недостаточно длинным для 64 байтов, поэтому он не печатал номер один, но затем продолжал печатать оставшуюся часть JSON в обычном режиме, потому что он не работал (ошибка).
Сегодня я добавил примечание к заголовочному файлу: ваш предварительно выделенный должен быть на 63 байта длиннее, чем вы ожидаете, что будет напечатанный json, если вы хотите избежать какого-либо выхода из ситуации, когда cJSON прерывается, потому что он думает, что ему не хватает память в предварительно выделенном буфере.