【问题标题】:Calculate the byte size of a cJSON object计算一个 cJSON 对象的字节大小
【发布时间】:2021-05-20 23:21:07
【问题描述】:

现在我正在努力计算cJSON 对象的大小。到目前为止,我已经这样做了:

cJSON *payload = cJSON_CreateObject();
...
size_t size_payload = sizeof(payload);

显然,我初始化了有效负载对象并打印到终端以验证数据的完整性,一切正常。但是,在打印出sizeof 结果后,它的字节数始终为 4,但对于长字符串(如我的),它应该在 500 字节左右。

我在这里处理cJSON 对象时遗漏了什么吗?

希望您能提供帮助,或者给我一个示例,说明如何获得整个尺寸的正确值。

【问题讨论】:

  • strlen(cJSON_Print(payload))?

标签: c++ c arduino esp32 cjson


【解决方案1】:

sizeof() 是编译时常量。它在运行时没有数据的概念。

sizeof(payload)payload 变量的字节大小,它被声明为cJSON* 指针。所以它的字节大小总是相同的 - sizeof(void*),在你的情况下是 4 个字节(因为你正在为 32 位编译你的应用程序)。它的大小不是它所指向的cJSON 对象的大小。

即使那样,如果您尝试取消引用指针并在cJSON 对象本身上使用sizeof(),即sizeof(*payload),它将是cJSON 结构本身在编译时的字节大小-time,而不是cJSON 对象在运行时为自己内部分配的任何数据的字节大小。

AFAICS,cJSON 没有提供返回它所持有的 JSON 数据的字节大小的方法,因此您只需将 JSON 格式化为字符串变量,然后在运行时查询该字符串的大小,例如:

char *str = cJSON_Print(payload); // or cJSON_PrintUnformatted() or cJSON_PrintBuffered() ...
if (str) {
    size_t len = strlen(str);
    cJSON_free(str);
    ...
}

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2022-11-12
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多