JSON封装与解码

cJSON

cJSON为json解析库,用于构建解析Json格式。

cJSON 开源项目位置:点击打开链接

JSON 主页:http://www.json.org/

 

json结构体

typedef struct cJSON {  
 struct cJSON *next,*prev;   
 struct cJSON *child;   
 int type;   
 char *valuestring;   
 int valueint;  
 double valuedouble;   
 char *string;   
} cJSON;  

 

说明

  1. cJSON结构体为双向链表,可利用child指针可访问下一层

  2. type决定了数据项(键)类型,valueint对应整形数据,其他类似

  3. string为节点名称,即:键名称

 

封装json函数说明

  1. cJSON_CreateObject(); //创建根数据对象

  2. cJSON_AddStringToObject(usr,"name","fengxin"); //在usr根数据中加入string类型的键,键名为:name,键值为:fengxin

  3. cJSON_Print(usr); //将json形式打印成正常字符串形式,因json中的string与普通string不同,需要进行转换使用

  4. cJSON_PrintUnformatted(usr) ; //用法与上同,区别在于该函数转换的格式不带\t、\n,不如3转换后美观

  5. cJSON_Delete(usr) ; //内存回收

  6. cJSON_AddItemToArray(root, cJSON_CreateString("Hello world")); //在usr根数据中添加string类型的数组

  7. cJSON_AddItemToArray(root, cJSON_CreateNumber(10)); //添加整型数组

 

解析json数据

  1. 将普通json串变成json对象,即创建json root过程

    cJSON *root;
    root = cJSON_Parse(js_string); 
  2. 提取关键字,从辈分高的祖层开始拿,其次为父层...

    例:out={"name":"fengxin","passwd":"123","num":1}

    cJSON *json,*json_name,*json_passwd,*json_num;
    ​
    json = cJSON_Parse(out); //解析成json形式
    json_name = cJSON_GetObjectItem( json , "name" );  //获取键值内容
    json_passwd = cJSON_GetObjectItem( json , "passwd" );
    json_num = cJSON_GetObjectItem( json , "num" );

    含父层例:s = {"list":{"name":"xiao hong","age":10},"other":{"name":"hua hua"}}

    char *s = "{\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}";
    cJSON *root = cJSON_Parse(s);
    if(!root) {
        printf("get root faild !\n");
        return -1;
    }
     
    cJSON *js_list = cJSON_GetObjectItem(root, "list");
    if(!js_list) {
        printf("no list!\n");
        return -1;
    }
    printf("list type is %d\n",js_list->type);
     
    cJSON *name = cJSON_GetObjectItem(js_list, "name");
    if(!name) {
        printf("No name !\n");
        return -1;
    }
    printf("name type is %d\n",name->type);
    printf("name is %s\n",name->valuestring);
     
    cJSON *age = cJSON_GetObjectItem(js_list, "age");
    if(!age) {
        printf("no age!\n");
        return -1;
    }
    printf("age type is %d\n", age->type);
    printf("age is %d\n",age->valueint);
     
    cJSON *js_other = cJSON_GetObjectItem(root, "other");
    if(!js_other) {
        printf("no list!\n");
        return -1;
    }
    printf("list type is %d\n",js_other->type);
     
    cJSON *js_name = cJSON_GetObjectItem(js_other, "name");
    if(!js_name) {
        printf("No name !\n");
        return -1;
    }
    printf("name type is %d\n",js_name->type);
    printf("name is %s\n",js_name->valuestring);
     
    if(root)
        cJSON_Delete(root);
        return 0;

    这里考虑严格,先进行了item判断,随后才进行取值

  3. json数组提取

    例:{"list":["name1","name2"]}

    char *s = "{\"list\":[\"name1\",\"name2\"]}";
    cJSON *root = cJSON_Parse(s);
    if(!root) {
        printf("get root faild !\n");
        return -1;
    }
    cJSON *js_list = cJSON_GetObjectItem(root, "list");
    if(!js_list){
        printf("no list!\n");
        return -1;
    }
    int array_size = cJSON_GetArraySize(js_list);
    printf("array size is %d\n",array_size);
    int i = 0;
    cJSON *item;
    for(i=0; i< array_size; i++) {
        item = cJSON_GetArrayItem(js_list, i);
        printf("item type is %d\n",item->type);
        printf("%s\n",item->valuestring);
    }
     
    if(root)
        cJSON_Delete(root);
  4. 数组中包含对象的提取

    例:{"list":[{"name":"xiao hong","age":10},{"name":"hua hua","age":11}]}

    char *s = "{\"list\":[{\"name\":\"xiao hong\",\"age\":10},{\"name\":\"hua hua\",\"age\":11}]}";
    cJSON *root = cJSON_Parse(s);
    if(!root) {
        printf("get root faild !\n");
        return -1;
    }
    cJSON *js_list = cJSON_GetObjectItem(root, "list");
    if(!js_list){
        printf("no list!\n");
        return -1;
    }
    int array_size = cJSON_GetArraySize(js_list);
    printf("array size is %d\n",array_size);
    int i = 0;
    cJSON *item,*it, *js_name, *js_age;
    char *p  = NULL;
    for(i=0; i< array_size; i++) {
        item = cJSON_GetArrayItem(js_list, i);
        if(!item) {
            //TODO...
        }
        p = cJSON_PrintUnformatted(item);
        it = cJSON_Parse(p);
        if(!it)
            continue ;
        js_name = cJSON_GetObjectItem(it, "name");
        printf("name is %s\n",js_name->valuestring);
        js_age = cJSON_GetObjectItem(it, "age");
        printf("age is %d\n",js_age->valueint);
     
    }
     
    if(root)
        cJSON_Delete(root);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值