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]\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

原文地址:https://www.cnblogs.com/icefree/p/11273471.html

时间: 2024-08-10 23:28:16

json文件解析的相关文章

【微信】微信小程序 微信开发工具中新创建的json文件,编译报错VM1781:2 pages/module/module.json 文件解析错误 SyntaxError: Unexpected end of JSON input

如果新创建报错:编译报错VM1781:2 pages/module/module.json 文件解析错误  SyntaxError: Unexpected end of JSON input 解决方法: 在JSON文件中添加 即可解决 { } 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9076271.html

Twaver的mono-desiner导出的json文件解析

以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.com/doc 中的操作指南. 将做好的模型导出为json格式的文件.下面将以图一所示的交换机为例对json文件进行简单解析.如图二所示为图一交换机的所导出的json文件的简单结构. 首先,所导出的json文件为一个json对象,里面包含有两个数组为primitives(原始)和assembles(装

json文件解析出现异常

今天在尝试用自带的NSJSONSerialization方法来解析本地json文件的时候碰到了系统异常,app自动终止 问题如下: 代码: NSString *newCoursePath = [[NSBundle mainBundle] pathForResource:@"addcourses" ofType:@"json"]; NSData *data = [NSData dataWithContentsOfFile:newCoursePath]; NSArray

Libgdx 之JSON文件解析

上一节我们学习了XML文件的解析,接下来我们再了解JSON文件的解析.在Libgdx中也提供了Json类来帮助我们解析文件,最常用的方法是fromJson(java.lang.Class type, FileHandle file) 通过此方法我们必须先定义一个内部类来抽象的表示Json文件. { "name": "David", "experience": 2534, "strength": 6, "dexteri

HBuilder开发移动App——manifest.json文件解析

以前做过Android App开发,对于各项配置都是在AndroidManifest.xml文件中完成的,包括权限的设定.图标.标签.App的名字.Activity注册等等 使用HBuilder开发移动App,HBuilder是基于Eclipse进行二次开发的,所以新建项目等各项操作与Eclipse类似. 首先新建一个移动App项目 这里选择mui项目,点击完成后可以看到项目文件列表,如下: 这里我们主要看一下manifest.json文件 应用信息 选择应用信息一项,然后 1.填写应用名称 也

iOS开发JSON文件解析数据成Model的过程简单介绍

本文内容来源:http://blog.csdn.net/smking/article/details/40432287 JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事情. 先说说这两个的差别. 这两个使用的方法其实都差不多, 详细的使用方法请直接GitHub上找, 还是比较简单地. 就我个人来说JSONModel相对起来使用较为简单,而Mantle使

IIS7 增加JSON文件解析

在MIME增加一个Json类型,在MIME增加一个配置如:添加---> 文件扩展名为 .JSON ,MIME类型为text/json(也有将application/x-javascript) 然后再在应用程序映射增加一个脚本映射请求路径为:*.JSON,可执行文件为C:/Windows/System32/inetsrv/asp.dll. 如果IIS7 没有找到asp.dll 需要添加插件: 控制面板-->程序-->打开和关闭Windows功能--->InterNet信息服务---&

c++ rapidjson读取json文件 解析

#include <iostream> #include <string> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" using namespace rapidjson; using namespace std; string readfile(const char *f

使用rapidJson解析json文件

今天介绍如果如何使用rapidJson解析json文件~笔者之前也使用过json库,可惜搬到cocos2d-x使用过程出现问题...忘了什么问题,搞了很久解决不了,索性使用cocos2d-x自带的json解析库~ 首先引入头文件,#include "cocostudio/CocoStudio.h",因为从cocosStudio导入项目的时候会有json文件~ 接着就是解析: std::string filePath = FileUtils::getInstance()->full