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 个额外的字节。
我在嵌入式平台中使用 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 个额外的字节。