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