cjson文件解析

对json文本的解析有两种方法:

第一种:利用 child指针进行访问

  • 利用child指针进行访问,需要不断的进行child,以进入深层循环中。
  • 访问面文本的slots数组中的成员
  • {
        "semantic":{
            "slots":[
                {
                    "name":"ZhangSan",
                    "ip":"ZhangSan"
                },
                {
                    "name":"LiSi",
                    "ip":"ZhangSan"
                },
                {
                    "name":"WangWu",
                    "ip":"ZhangSan"
                }
            ]
        },
        "rc":0,
        "operation":"CALL",
        "service":"telephone",
        "text":"Call ZhangSan"
    }

    解析方法:

  • char * jsonStr = "{\"semantic\":{\"slots\":[{\"name\":\"ZhangSan\",\"ip\":\"ZhangSan\"},{\"name\":\"LiSi\",\"ip\":\"ZhangSan\"},{\"name\":\"WangWu\",\"ip\":\"ZhangSan\"}]}, \"rc\":0, \"operation\":\"CALL\", \"service\":\"telephone\", \"text\":\"Call ZhangSan\"}";
        cJSON * root = NULL;
        cJSON * item = NULL;//cjson对象
    
        root = cJSON_Parse(jsonStr);     //解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc()函数在内存中开辟一个空间,使用完成需要手动释放。
        if (!root) 
        {
            printf("Error before: [%s]\n",cJSON_GetErrorPtr());
        }
        else
        {
            cJSON *slots_arr = cJSON_GetObjectItem(root->child, "slots");
            if( NULL != slots_arr ){
                cJSON *next ;
                int i;
                for(next= slots_arr->child; NULL!=next;)
                {
    char * ip = cJSON_GetObjectItem( next , "name")->valuestring ; char * mask = cJSON_GetObjectItem( next , "ip")->valuestring ; printf("ip: %s mask: %s\n",ip,mask); next = next->next ; } } }

    运行输出:

  • ip: ZhangSan  mask: ZhangSan
    ip: LiSi  mask: ZhangSan
    ip: WangWu  mask: ZhangSan

第二种:定义cJSON结构体指针进行访问

  • 利用cJSON结构体指针访问,一层一个指针,下一层的cJSON指针等于对上一层的cJSON结构体进行访问,从而获得其成员;
  • 对下面的json文件进行访问
  • {
        "port":[{
            "com3":{
                "bound": 2400,
                "device_type":    "master",
                "device_addr":    ["404887000027", "404887000028"]
                }
            },{
            "com4":{
                "bound": 2400,
                "device_type":    "master",
                "ammeter_addr":    []
                }
            },{
            "com5":{
                "bound": 2400,
                "device_type":    "master",
                "ammeter_addr":    ["404887000027"]
                }
            },{
            "com6":{
                "bound": 2400,
                "device_type":    "master",
                "device_addr":    ["404887000027", "404887000028","404887000027", "404887000028"]
                }
            }
        ]
    }
  • 从上面文件可以看出,一共有四层嵌套,分别是:port、com、bound、addr数组;
  • 解析方法:
  • int port_count, addr_count;
        int i,j;
        char *str;
        cJSON *js_root, *js_one, *js_two, *js_three, *js_four, *it, *member;
    
        str = (char *)malloc(4);
        js_root = load_json_file("device.json");
        
        if(!js_root){
            return -1;
        }
    
        js_one = cJSON_GetObjectItem(js_root, "port");
        if(!js_one){
            printf("no port\n");
            return -1;
        }
        
        port_count = cJSON_GetArraySize(js_one);   //获取数组中成员个数
        printf("\nport count = %d\n", port_count);
    
        for(i = 0; i < port_count; i++) {
            js_two = cJSON_GetArrayItem(js_one, i);
            printf("\n----------------------------------------cJSON_GetArrayItem js_one, %d ----------------------------------------\n", i);
            printf("%s", cJSON_Print(js_two));
    
            switch(i){
                case 0: strcpy(str, "com3");break;
                case 1: strcpy(str, "com4");break;
                case 2: strcpy(str, "com5");break;
                case 3: strcpy(str, "com6");break;
            }
            js_three = cJSON_GetObjectItem(js_two, str);
            printf("%s\n", cJSON_Print(js_three));
    
            it = cJSON_GetObjectItem(js_three, "bound");
            printf("name type is %s\n",it->string);
            printf("name is %d\n",it->valueint);
    
            it = cJSON_GetObjectItem(js_three, "device_type");
            printf("name type is %s\n",it->string);
            printf("name is %s\n",it->valuestring);
    
            js_four = cJSON_GetObjectItem(js_three, "device_addr");
            printf("%s\n", cJSON_Print(js_four));
            addr_count = cJSON_GetArraySize(js_four);
            printf("%d\n", addr_count);
    
            if(addr_count == 0)
                continue;
            else{
    
                for(j = 0; j < addr_count; j++) {
                    member = cJSON_GetArrayItem(js_four, j);
                    printf("name is %s\n",member->valuestring);
                }       
            }    
        }
  • 运行结果:

  • port count = 4
    
    ----------------------------------------cJSON_GetArrayItem js_one, 0 ----------------------------------------
    {
        "com3":    {
            "bound":    2400,
            "device_type":    "master",
            "device_addr":    ["404887000027", "404887000028"]
        }
    }{
        "bound":    2400,
        "device_type":    "master",
        "device_addr":    ["404887000027", "404887000028"]
    }
    name type is bound
    name is 2400
    name type is device_type
    name is master
    ["404887000027", "404887000028"]
    2
    name is 404887000027
    name is 404887000028
    
    ----------------------------------------cJSON_GetArrayItem js_one, 1 ----------------------------------------
    {
        "com4":    {
            "bound":    2400,
            "device_type":    "master",
            "device_addr":    []
        }
    }{
        "bound":    2400,
        "device_type":    "master",
        "device_addr":    []
    }
    name type is bound
    name is 2400
    name type is device_type
    name is DLT645_2007
    []
    0
    
    ----------------------------------------cJSON_GetArrayItem js_one, 2 ----------------------------------------
    {
        "com5":    {
            "bound":    2400,
            "device_type":    "master",
            "device_addr":    ["404887000027"]
        }
    }{
        "bound":    2400,
        "device_type":    "master",
        "device_addr":    ["404887000027"]
    }
    name type is bound
    name is 2400
    name type is device_type
    name is master
    ["404887000027"]
    1
    name is 404887000027
    
    ----------------------------------------cJSON_GetArrayItem js_one, 3 ----------------------------------------
    {
        "com6":    {
            "bound":    2400,
            "device_type":    "master",
            "device_addr":    ["404887000027", "404887000028", "404887000027", "404887000028"]
        }
    }{
        "bound":    2400,
        "device_type":    "master",
        "device_addr":    ["404887000027", "404887000028", "404887000027", "404887000028"]
    }
    name type is bound
    name is 2400
    name type is device_type
    name is master
    ["404887000027", "404887000028", "404887000027", "404887000028"]
    4
    name is 404887000027
    name is 404887000028
    name is 404887000027
    name is 404887000028

猜你喜欢

转载自www.cnblogs.com/icefree/p/11273471.html
今日推荐