cJSON的构建和解析

本文介绍了如何使用cJSON库进行JSON数据的构建和解析。首先展示了cJSON构建过程,然后详细阐述了解析JSON文本文件的步骤,包括打开文件、读取内容到缓冲区、通过cJSON_Parse转换为cJSON对象,并利用cJSON_PrintUnformatted打印解析后的对象格式。

一、cjson构建

#define MODULE_NUM 		3

int encode_Json(){
    char nameBuffer[10] = "caotuo";
    int id[6] = {1,2,3,4,5,6};

    cJSON *root = cJSON_CreateObject();                    //在根节点创建cjson对象{}  root
    cJSON *name_list_array = cJSON_CreateArray();        //创建数组对象[]  name_list_array    
    cJSON_AddItemToObject(root, "name_list", name_list_array);  //在根节点下添加数组对象[] 并命名为 name_list
    
    for(int i=0; i<MODULE_NUM; i++){
        cJSON *Item = cJSON_CreateObject();               //创建cjson对象{}  Item
        cJSON_AddItemToArray(name_list_array, Item);   //在数组对象[]下添加 cjson对象Item
        cJSON_AddStringToObject(Item, "name", nameBuffer );  //填充数组中的 cjson对象
        cJSON_AddNumberToObject(Item, "id", 0 );
        cJSON_AddNumberToObject(Item, "num_error", 0 );
        cJSON_AddNumberToObject(Item, "num_warning", 0 );
    }

    cJSON_AddItemToObject(root, "list_nums", cJSON_CreateNumber(1));
    cJSON_AddItemToObject(root, "list_date", cJSON_CreateString("20191122"));
	
    cJSON *id_list_array = cJSON_CreateArray();		//创建数组对象[]  id_list_array
    cJSON_AddItemToObject(root, "id_arraay", id_list_array); //在根节点下添加数组对象[]
    for(int i=0; i<6; i++){
	    cJSON_AddNumberToObject(id_list_array, "id_arraay", id[i]);  //填充数组对象[]
    }

    char *buffer = cJSON_Print(root);
    printf("\n\n%s\n\n", buffer);
}

打印结果:

{
    "name_list":    [{
            "name":    "caotuo",
            "id":    0,
            "num_error":    0,
            "num_warning":    0
        }, {
            "name":    "caotuo",
            "id":    0,
            "num_error":    0,
            "num_warning":    0
        }, {
            "name":    "caotuo",
            "id":    0,
            "num_error":    0,
            "num_warning":    0
        }],
    "list_nums":    1,
    "list_date":    "20191122",
    "id_arraay":    [1, 2, 3, 4, 5, 6]
}

二、cjson解析

假设有一个json格式的文本文件,现在需要解析里面的每一个键对应的value值。步骤如下:

1.open文件,该文件内容如下(待解析的json文本)

{"rootError": [
		{"name": "volt_error", 
		 "struct": [{"code": "111", "brief": "aaaaa", "type": "Warning", "light": "Y", "mod": "module1", "id": "7"}, {"code": "222", "brief": "bbbbb", "type": "Warning", "light": "Y", "mod": "module2", "id": "7"}, {"code": "333", "brief": "ccccc", "type": "Error", "light": "Y", "mod": "module3", "id": "2"}]
                }, 
		{"name": "current_error", 
		 "struct": [{"code": "444", "brief": "ddddd", "type": "Error", "light": "N", "mod": "module4", "id": "2"}]
                }
	      ]
}

2.read到缓存中*buffer

3.用 cJSON * root = cJSON_Parse(buffer);  将缓存中的数据解析为cjson对象格式,并获得根节点root。此时可以通过char *buffer2 = cJSON_PrintUnformatted(root); 来打印buffer2,也就是cjson对象格式

int decode_cJson()
{
    int fd;
    int ret = -1;
    int size = 0;
    char buffer[65532];

    fd = open(FILE_ERROR_CODE, O_RDONLY);
    read(fd, buffer, sizeof(buffer));
    close(fd);

    cJSON * root = cJSON_Parse(buffer);
    cJSON * head = cJSON_GetObjectItem(root, "rootError");
    size = cJSON_GetArraySize(head);//rootError数组成员的数量 size=2
	
    for(int i=0; i<size; i++)
    {
        cJSON * tab = cJSON_GetArrayItem(head, i);
        cJSON * data = cJSON_GetObjectItem(tab, "struct");
        int tabsize = cJSON_GetArraySize(data);//struct数组成员的数量 tabsize=3、1
		
        for(int j=0; j<tabsize; j++)
        {
            cJSON * item = NULL;
            cJSON * index = cJSON_GetArrayItem(data, j);        
            item = cJSON_GetObjectItem(index, "code");
            
            if(item != NULL && item->valuestring != NULL)
            {
                printf("code=%s\n", item->valuestring);
                int code = atoi(item->valuestring);
				
                item = cJSON_GetObjectItem(index, "brief");
                if(item != NULL && item->valuestring != NULL)
                    sprintf(info->brief, "%s", item->valuestring);
                printf("brief=%s\n", item->valuestring);
				
                item = cJSON_GetObjectItem(index, "type");
                if(item != NULL && item->valuestring != NULL)
                    sprintf(info->type, "%s", item->valuestring);
                printf("type=%s\n", item->valuestring);
				
                item = cJSON_GetObjectItem(index, "light");
                if(item != NULL && item->valuestring != NULL){
                if(0 == strcmp(item->valuestring, "Y"))
                    int light = 1;
                else
                    int light = 0;
                }
                printf("light=%s\n", item->valuestring);
				
                item = cJSON_GetObjectItem(index, "id");
                if(item != NULL && item->valuestring != NULL){
                    int id = atoi(item->valuestring);		
                }
                printf("id=%s\n", item->valuestring);
				
            	//cJSON_Delete(root);
                //return 0;
                ret = 0;
            }
            
        }
    }

    char *buffer2 = cJSON_PrintUnformatted(root);
    *len = strlen(buffer2);
    printf("buffer2=%s\n\n", buffer2);

    free(buffer2);
    cJSON_Delete(root);
	
    return ret;
}

 

<think>好的,我现在需要回答用户关于cJSON库如何解析使用的问题。首先,用户已经提供了几个引用资料,我需要仔细阅读这些资料,提取关键信息,并按照用户的要求结构化回答。 首先,用户的问题明确:想了解cJSON库的解析使用方法,以及示例教程。根据引用内容,引用[1]介绍了cJSON库的基本信息,引用[2]提到了应用案例最佳实践,引用[3][4]给出了具体的代码示例API使用方法。我需要整合这些信息,分步骤讲解解析使用方法,并提供代码示例。 接下来,按照用户给出的系统级指令,需要遵循格式要求,比如行内数学表达式使用$...$,但这里可能用不上数学表达式,但要注意代码块的格式。用户要求用中文回答,生成相关问题,并在引用处添加标识。 我应该先介绍cJSON库的基本概念,然后分解析生成两部分讲解,每部分列出步骤,并给出代码示例。例如,解析JSON数据的步骤可能包括初始化、解析字符串、获取对象、处理数据、释放内存等。同样,生成JSON数据需要创建对象、添加项、转换为字符串、释放资源。 需要确保代码示例正确,并且符合用户提供的引用中的示例。比如引用[3]中的代码可能包含创建cJSON对象的具体步骤,而引用[4]则说明了如何解析数组等。此外,引用[2]提到内存管理最佳实践,这部分也要在注意事项里强调。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如内存管理、复杂结构处理、与其他库的比较等。确保问题相关且有参考价值。 现在需要组织这些内容,结构清晰,分步骤说明,并正确引用来源。同时检查LaTeX语法是否正确,但可能这里用不上数学公式,但代码块需要用正确的格式。确保回答真实可靠,引用标识正确添加。</think>### cJSON解析与使用教程 #### 一、基本概念 cJSON是一个轻量级C语言JSON解析库,适用于嵌入式系统物联网场景,提供简单API实现JSON数据的解析与生成[^1]。其核心数据结构为$cJSON$结构体,通过链表形式管理JSON键值对。 --- #### 二、JSON解析步骤 1. **初始化解析器** ```c #include "cJSON.h" ``` 2. **解析JSON字符串** ```c const char *json_str = "{\"name\":\"Alice\",\"age\":25}"; cJSON *root = cJSON_Parse(json_str); // 返回根对象指针[^4] ``` 3. **获取键值对** ```c cJSON *name_item = cJSON_GetObjectItem(root, "name"); // 通过键名获取值[^4] printf("Name: %s\n", name_item->valuestring); cJSON *age_item = cJSON_GetObjectItem(root, "age"); printf("Age: %d\n", age_item->valueint); ``` 4. **处理数组数据** ```c cJSON *skills = cJSON_GetObjectItem(root, "skills"); int array_size = cJSON_GetArraySize(skills); for(int i=0; i<array_size; i++){ cJSON *item = cJSON_GetArrayItem(skills, i); printf("Skill %d: %s\n", i+1, item->valuestring); } ``` 5. **释放内存** ```c cJSON_Delete(root); // 必须手动释放内存[^2] ``` --- #### 三、JSON生成步骤 1. **创建根对象** ```c cJSON *root = cJSON_CreateObject(); // 创建空JSON对象[^3] ``` 2. **添加键值对** ```c cJSON_AddStringToObject(root, "name", "Bob"); cJSON_AddNumberToObject(root, "age", 30); ``` 3. **构建嵌套结构** ```c cJSON *address = cJSON_CreateObject(); cJSON_AddStringToObject(address, "country", "China"); cJSON_AddNumberToObject(address, "zipcode", 100000); cJSON_AddItemToObject(root, "address", address); ``` 4. **输出JSON字符串** ```c char *json_output = cJSON_Print(root); printf("%s\n", json_output); ``` 5. **清理资源** ```c free(json_output); // cJSON_Print分配的内存需单独释放 cJSON_Delete(root); ``` --- #### 四、完整示例代码 ```c #include <stdio.h> #include "cJSON.h" int main() { // 解析示例 const char *json_str = "{\"name\":\"Alice\",\"skills\":[\"C\",\"Python\"]}"; cJSON *root = cJSON_Parse(json_str); cJSON *name = cJSON_GetObjectItem(root, "name"); cJSON *skills = cJSON_GetObjectItem(root, "skills"); printf("Name: %s\nSkills:\n", name->valuestring); for(int i=0; i<cJSON_GetArraySize(skills); i++){ cJSON *item = cJSON_GetArrayItem(skills, i); printf("- %s\n", item->valuestring); } cJSON_Delete(root); // 生成示例 cJSON *new_root = cJSON_CreateObject(); cJSON_AddStringToObject(new_root, "device", "SensorX"); cJSON_AddNumberToObject(new_root, "value", 24.5); char *output = cJSON_Print(new_root); printf("\nGenerated JSON:\n%s\n", output); free(output); cJSON_Delete(new_root); return 0; } ``` --- #### 五、注意事项 1. **内存管理**:所有$cJSON$对象必须通过$cJSON_Delete()$释放,$cJSON_Print()$生成的字符串需用$free()$释放 2. **错误处理**:检查$cJSON_Parse()$返回值是否为NULL,防止解析失败 3. **数据类型验证**:通过$cJSON_IsString$/$cJSON_IsNumber$等函数验证数据类型 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值