【问题标题】:cJSON print function doesn't add number to objectcJSON 打印功能不会向对象添加数字
【发布时间】:2017-03-15 14:29:31
【问题描述】:

我开发了一个 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 函数。

有什么建议吗?

谢谢

【问题讨论】:

  • 使用json-c which is solid as a rock,使用简单。这可能是 cJSON 库中的错误。
  • 我需要一个用于嵌入式系统的轻量级库。是吗?
  • 是的,事实上非常轻量级。它速度快,应用广泛。
  • 我可以添加 *.c 和 *h 文件还是需要添加编译版本?
  • 您可以从 github 下载源代码,如果您知道如何编译,可以使用您的代码进行编译。这并不难,只是几个文件。 Just click the link

标签: c json malloc cjson


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这很有趣,我相信我知道发生了什么。很抱歉我写了那个错误给我带来的任何不便......

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

    print_number 将在打印数字之前尝试分配 64 字节的内存,因为它不知道sprintf 需要多少字节,而snprintf 在 ANSI C 中不可用。您的预分配缓冲区可能不是' t 对于 64 字节来说足够长,所以它没有打印第一个,但随后继续正常打印 JSON 的其余部分,因为它没有失败(错误)。

    我今天在头文件中添加了一条注释:如果您想避免 cJSON 中止因为它认为它没有出现任何异常情况,那么您的预分配必须比您期望打印的 json 长 63 个字节预分配的缓冲区中没有足够的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多