cJSON

cJSON是一个轻量级的JSON解析器和生成器,因其简洁的代码和易于集成的特点而被推荐优先使用。在使用过程中,包括创建、解析、输出、取节点、取值、取节点名字、添加和删除节点等步骤。需要注意的是,cJSON在处理数字时不分整数和浮点数,并且在删除节点、释放内存以及验证字段存在等方面有特定的要求。

优点:cJSON只有cJSON.h和cJSON.c两个文件、600行代码可以直接加到工程项目中,不必编译成库使用。

结论:优先使用cJSON


cJSON结构:

/* The cJSON structure: */
typedef struct cJSON {
	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

	int type;					/* The type of the item, as above. */

	char *valuestring;			/* The item's string, if type==cJSON_String */
	int valueint;				/* The item's number, if type==cJSON_Number */
	double valuedouble;			/* The item's number, if type==cJSON_Number */

	char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;


使用过程:


1.创建

        cJSON *cjson = cJSON_CreateObject();   //创建一个对象节点
        cJSON *cjson = cJSON_CreateArrary();    //创建一个数组
        cJSON *cjson = cJSON_CreateString(const char *ch);    //创建一个字符串类型的节点,保存ch
        cJSON *cjson = cJSON_CreateNumber(double n);    //创建一个数字类型的节点,保存n,不分整数和浮点数
        ...

        cJSON_CreateXXX内部使用malloc分配动态内存,使用完后一定调用

        cJSON_Delete(cjson);


2.解析

        char *ch = "{\"name\":\"rongxiaojun\", \"object\":[\"xys\", \"hdm\", \"qinxiaohui, my friend\", \"songtao, laji\"]}";
        cJSON *cjson = cJSON_Parse(ch);

   温馨提示

        a.若字符串格式不符合规范,cJSON_Parse返回0

        b.使用完后使用cJSON_Delete(cjson)进行空间释放


3.输出

        char* ch = cJSON_Print(cJSON *cjson);

       内部用malloc为ch分配了空间,所以使用完后需free(ch)


4.取节点

   4.1对象节点

        //取cjson中名字为"name"的子节点,故cj->string = "name"
        cJSON *cj = cJSON_GetObjectItem(cjson, "name");

    4.2数组节点

        //从cjson数组取第n个元素(数组元素也为节点)
        cJSON *cj = cJSON_GetArrayItem(cjson, n);

    温馨提示:字段不存在均返回0


5.取值

	char *ch = cjson->valuestring;
	int n = cjson->valueint;
	double d = cjson->valuedouble; 

6.取节点名字

        char *ch = cj->string;

        注意:取名操作通常用于子节点,因为顶级节点没名所以对顶级节点取名会出错


7.添加节点

    7.1 添加普通对象节点

        cJSON_AddStringToObject(cjson, "name", "rongxiaojun");
        cJSON_AddNumberToObject(cjson, "name", n);

    7.2 添加数组节点

        cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));
        cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

    温馨提示:cJSON在添加数字时不区分整数和浮点数,该值被同时赋给cjson->valueint和cjson->valuedouble,用户根据需要取出对应值


8. 删除节点

    8.1 删除普通对象节点

        删除key为name的节点

cJSON_DeleteItemFromObject(cjson, "name");

    8.2 删除数组节点

        删除数组中第2个元素

cJSON_DeleteItemFromArray(cjson, 2);
    温馨提示:cJSON_DeleteItemFrom*函数在删除节点时内存即清理,故不存在内存泄露问题,可放心使用。


9.数组


9.1 取数组个数

        int num = cJSON_GetArraySize(cj);


9.2 取节点

/*从cjson数组取第n个元素(数组元素也为节点)*/        
cJSON *cj = cJSON_GetArrayItem(cjson, n);  
//不存在返回0

9.3 添加节点

cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));
cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

示例

		cJSON *cjson = cJSON_CreateArray();
		
		cJSON_AddItemToArray(cjson, cJSON_CreateString("123456"));
		cJSON_AddItemToArray(cjson, cJSON_CreateString("nihaihaoma"));
		cJSON_AddItemToArray(cjson, cJSON_CreateString("jintianxingqiwule"));

		int iCnt = cJSON_GetArraySize(cjson);
		for(int i = 0; i != iCnt; ++i)
			printf("%s\n", cJSON_GetArrayItem(cjson, i)->valuestring);
结果



10.验证字段存在

        if(cJSON_GetObjectItem(cjson, str.c_str()) == NULL)
                return false;
        else
                return true;

11.bool操作

        a.添加:cJSON_AddBoolToObject(cjson, "name", flag);

        b.读取:bool bRes = cJSON_GetObjectItem(cjson, "name")->type;


//从cjson数组取第n个元素(数组元素也为节点) cJSON *cj = cJSON_GetArrayItem(cjson, n);
10-14
<think>嗯,用户希望了解cJSON的相关信息,包括使用指南、文档和源码等。用户提供了两段站内引用作为参考,一段是关于cJSON解析数组的基本流程和API,另一段展示了如何解析JSON对象的示例代码。用户明确指出这些引用仅供参考,需要综合用户历史提问内容来回应。 从用户当前和之前的提问模式看,ta可能是嵌入式开发者或C语言程序员,正在处理JSON数据解析任务。用户两次都提到代码片段,说明需要实用性强、可直接集成到项目中的技术资源。考虑到cJSON是轻量级C语言库,用户可能面临嵌入式环境或性能敏感场景。 需要覆盖四个核心方面:基础用法、关键API详解、最佳实践和资源获取。基础用法部分要突出解析和构建JSON的流程,参考用户提供的API列表但需补充完整步骤;API详解需重点说明用户引用中提到的cJSON_Parse、cJSON_GetObjectItem等函数;最佳实践要包含内存管理和错误处理这些嵌入式开发的关键点;资源获取则提供官方GitHub链接和文档入口。 特别要注意用户引用[2]中的代码示例存在隐患——未检查cJSON_GetObjectItem返回的指针就直接访问成员。这在实际使用中会导致段错误,必须在最佳实践部分强调指针校验的重要性。同时用户引用[1]提到的数组解析API需要补充完整示例,展示cJSON_GetArraySize和cJSON_GetArrayItem的配合用法。 最后生成的问题要引导用户深入技术细节:性能优化适用于关注效率的用户,对比其他库能帮助架构选型,错误处理则是工程化必需,而结构体解析可能解决用户当前未明说的嵌套JSON处理需求。 </think>以下是关于cJSON库的核心信息整理,结合官方文档和常见实践: ### 一、基础介绍 cJSON是**轻量级C语言JSON解析库**,源码仅单文件(`cJSON.c` + `cJSON.h`),适合嵌入式系统和资源受限环境。特点: 1. **无外部依赖**:纯ANSI C实现(C89标准) 2. **MIT许可证**:可免费商用 3. **跨平台**:支持Windows/Linux/RTOS等 4. **数据结构**:通过链表管理JSON键值对 > 官方源码仓库:[https://github.com/DaveGamble/cJSON](https://github.com/DaveGamble/cJSON) --- ### 二、核心API详解 #### 1. **JSON解析流程** ```c cJSON *root = cJSON_Parse(json_string); // 解析JSON字符串[^1] if (root == NULL) { const char *error_ptr = cJSON_GetErrorPtr(); // 获取错误位置 return; } cJSON *item = cJSON_GetObjectItem(root, "key"); // 获取键值对[^1][^2] if (item != NULL) { if (cJSON_IsString(item)) printf("%s\n", item->valuestring); if (cJSON_IsNumber(item)) printf("%d\n", item->valueint); } cJSON_Delete(root); // 释放内存[^1] ``` #### 2. **数组处理** ```c cJSON *array = cJSON_GetObjectItem(root, "array_key"); int size = cJSON_GetArraySize(array); // 获取数组长度[^1] for (int i = 0; i < size; i++) { cJSON *elem = cJSON_GetArrayItem(array, i); // 按索引获取元素[^1] printf("Element %d: %s\n", i, elem->valuestring); } ``` #### 3. **构建JSON** ```c cJSON *root = cJSON_CreateObject(); // 创建对象 cJSON_AddStringToObject(root, "name", "cJSON"); cJSON_AddNumberToObject(root, "version", 1); cJSON *array = cJSON_CreateArray(); // 创建数组 cJSON_AddItemToArray(array, cJSON_CreateString("item1")); cJSON_AddItemToObject(root, "data", array); char *json_str = cJSON_Print(root); // 生成格式化JSON字符串 free(json_str); // 手动释放字符串 cJSON_Delete(root); ``` --- ### 三、最佳实践 1. **内存管理**: - 所有`cJSON_Create*`创建的对象需用`cJSON_Delete()`释放 - `cJSON_Print()`生成的字符串需用`free()`释放 2. **错误处理**: ```c cJSON *root = cJSON_Parse(buffer); if (!root) { fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr()); } ``` 3. **类型校验**: ```c cJSON *item = cJSON_GetObjectItem(root, "age"); if (cJSON_IsNumber(item)) { ... } // 检查类型 ``` --- ### 四、资源指引 | 资源类型 | 获取方式 | |----------------|------------------------------------------| | **官方文档** | [cJSON.h头文件注释](https://github.com/DaveGamble/cJSON/blob/master/cJSON.h) | | **在线测试** | [JSON在线解析工具](https://jsonformatter.org/) | | **源码下载** | `git clone https://github.com/DaveGamble/cJSON.git` | | **实例教程** | [官方Wiki示例](https://github.com/DaveGamble/cJSON/wiki) | > 注:调试时可开启`CJSON_DEBUG`宏,开启内存泄漏检测 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值