cJSON的构建和解析

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值