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

cJson how to compute length of print buffer

我在嵌入式平台中使用 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,我基本上通过将每个键和对象的长度相加来计算缓冲区长度。

例如:strlen("Zone") + strlen(xyzStr) + ... + "" 的个数 + {} 的个数 + 的个数,+ 的个数 :

通过这种方式,我获得了 JSON.

的确切长度

不幸的是,函数 "cJSON_PrintPreallocated" 由于缓冲区长度不正确(看起来很短)而失败。

如果我向 "jsonMessage" 添加额外的 30 个字节,一切正常。

我哪里错了?

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

谢谢!

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

这可能会在 cJSON 的未来版本中改变,但现在有解决办法。

为了安全起见,您应该始终使缓冲区比您预期的长 63 字节。

更新:

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