cJSON 出自 Dave Gamble 之手,是个极轻量的 C JSON 库,就两个文件:cJSON.c 约 3200 行,cJSON.h 约 306 行。无外部依赖,MIT 协议,嵌入式、IoT 里经常见到它的身影。
数据结构
整个库的核心是一个 cJSON 结构体(cJSON.h 第 103–123 行),任何 JSON 值都用它表示:
typedef struct cJSON {
struct cJSON *next; /* 同级下一个兄弟节点 */
struct cJSON *prev; /* 同级上一个兄弟节点 */
struct cJSON *child; /* 第一个子节点(仅 Array/Object 使用) */
int type; /* 节点类型(位掩码) */
char *valuestring; /* 字符串值(String/Raw 类型) */
int valueint; /* 整数值(已废弃,建议用 valuedouble) */
double valuedouble; /* 数字值(Number 类型) */
char *string; /* 键名(仅当节点是对象的子项时有效) */
} cJSON;
- next / prev:同层兄弟双向链表,数组元素之间、对象键值对之间都靠它。
- child:只在 Array / Object 上有意义,指向第一个子节点,剩下的子节点通过
next串起来。 - type:位掩码表示类型,后面展开。
- valuestring / valueint / valuedouble:按类型选用。数字统一建议用
valuedouble,valueint仅为兼容保留。 - string:作为对象成员时存键名。
内存布局(64 位系统示例)
64 位下指针 8 字节,int 4 字节,double 8 字节,考虑对齐后约 64 字节/节点。32 位下约 40 字节。大致布局:
| 偏移 (字节) |
|---|


