• json文件解析


    对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]
      ",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 ",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
      ");
              return -1;
          }
          
          port_count = cJSON_GetArraySize(js_one);   //获取数组中成员个数
          printf("
      port count = %d
      ", port_count);
      
          for(i = 0; i < port_count; i++) {
              js_two = cJSON_GetArrayItem(js_one, i);
              printf("
      ----------------------------------------cJSON_GetArrayItem js_one, %d ----------------------------------------
      ", 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
      ", cJSON_Print(js_three));
      
              it = cJSON_GetObjectItem(js_three, "bound");
              printf("name type is %s
      ",it->string);
              printf("name is %d
      ",it->valueint);
      
              it = cJSON_GetObjectItem(js_three, "device_type");
              printf("name type is %s
      ",it->string);
              printf("name is %s
      ",it->valuestring);
      
              js_four = cJSON_GetObjectItem(js_three, "device_addr");
              printf("%s
      ", cJSON_Print(js_four));
              addr_count = cJSON_GetArraySize(js_four);
              printf("%d
      ", 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
      ",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
  • 相关阅读:
    2018 我要告诉你的 Vue 知识大全
    探究Javascript模板引擎mustache.js使用方法
    高性能JavaScript模板引擎实现原理详解
    junit报错
    http报文
    web应用和http协议
    eclipse首次使用基本设置
    利用亚马逊AWS搭建个人服务器
    图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
    MyEclipse 设置条件断点
  • 原文地址:https://www.cnblogs.com/icefree/p/11273471.html
Copyright © 2020-2023  润新知