cJson如何计算打印缓冲区的长度

时间:2017-03-17 09:39:39

标签: c json string cjson

我正在使用cJson for C,进入嵌入式平台,构建一个这样的JSON:

{"ProtocolVersion":1,"ID":"123","Zone":"xyz","MessageType":42,"Message":"Json payload MSG #6"}

为此,我使用cJson提供的这个功能:

  jsonObject = cJSON_CreateObject();

  /* Add Protocol Version */
  cJSON_AddNumberToObject( jsonObject, "ProtocolVersion", 1);
  /* Add Machine Id */
  cJSON_AddStringToObject( jsonObject, "ID", idStr );
  /* Add Market */
  cJSON_AddStringToObject( jsonObject, "Zone", xyzStr);
  /* Add Message Type */
  cJSON_AddNumberToObject( jsonObject, "MessageType", typeNum);
  /* Add Message */
  cJSON_AddStringToObject( jsonObject, "Message", msgStr);

要创建json,我使用了函数:

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

我更喜欢将cJson传递给我的应用程序预先分配的缓冲区,并且我基本上通过求和每个Key和Object的长度来计算缓冲区长度。

例如:strlen(“Zone”)+ strlen(xyzStr)+ ... +“”的数量+ {}的数量+数量,+数量:

通过这种方式,我获得了JSON的确切长度。

不幸的是,函数“cJSON_PrintPreallocated”由于缓冲区长度不正确而失败(似乎很短)。

如果我在“jsonMessage”中添加额外的30个字节,一切正常。

我哪里错了?

这是计算cJson所需缓冲区长度的最佳方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

打印数字时,cJSON保守地在输出缓冲区中保留64个字节,因为它无法确定sprintf打印数字的时间。如果数字为1,这可能意味着cJSON请求比实际需要多63个字节。

这可能会在cJSON的未来版本中发生变化,但现在可以解决这个问题了。

为了安全起见,你应该总是使你的缓冲区比你预期的长63个字节。

<强>更新

这已更新。由于版本1.4.6仅需要5个额外字节。