我正在使用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所需缓冲区长度的最佳方法吗?
谢谢!
答案 0 :(得分:1)
打印数字时,cJSON保守地在输出缓冲区中保留64个字节,因为它无法确定sprintf打印数字的时间。如果数字为1
,这可能意味着cJSON请求比实际需要多63个字节。
这可能会在cJSON的未来版本中发生变化,但现在可以解决这个问题了。
为了安全起见,你应该总是使你的缓冲区比你预期的长63个字节。
<强>更新强>
这已更新。由于版本1.4.6仅需要5个额外字节。