cJSON打印功能不会向对象添加数字

时间:2017-03-15 14:29:31

标签: c json malloc 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时,属性" Type"没有价值。

这是内置的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函数。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:0)

我更新了cJSON模块,现在工作正常。

答案 1 :(得分:0)

这很有意思,我相信我知道发生了什么。对于因编写该错误而造成的任何不便表示抱歉...

在版本1.4.0中,我向cJSON提出了一个错误,即打印数字的函数在无法分配足够内存时不会失败。

print_number会在打印数字之前尝试分配64个字节的内存,因为它不知道需要多少字节sprintf而ANSI中不提供snprintf C.您的预分配缓冲区可能不足以支持64个字节,因此它不会打印第一个,但是然后继续正常打印剩余的JSON,因为它没有失败(缺陷)。

我今天在头文件中添加了一个注释:如果你想避免任何cJSON中止的情况,你预先分配的内容必须比你预期的打印json长63个字节,因为它认为它没有&# 39; t在预分配的缓冲区中有足够的内存。