通过GSON解析复杂json数据(一)

普通的Json数据通过 JSONObject 和 GSON 很容易可以解析
如 :
String str = “[{\”travelCode\”:\”20170516010002\”,\”startTime\”:\”2017-06-03\”,\”endTime\”:\”2017-06-05\”,\”pagenum\”:\”\”}”];
这是最简单的 JSON 数据格式 ,两端的中括号代表着它是个 JSON 数组 ,
我们只要使用

List<Map<String,Object>> listMap = gson.fromJson(str, new TypeToken<List<Map<String,String>>>(){}.getType());

就可以通过键读取数据
注意解析时分析 json 的结构
那么复杂的 json 数据该怎么解析呢?
疯狂百度之后发现 , 通过分析 json 格式 , 创建 javaBean 对象 , 通过javaBean 对象可以很简单的将 json 解析为 list 或者 object
如:

String str = "[{\"users\":[{\"name\":\"系统001\",\"code\":\"sys01\"},{\"name\":\"系统003\",\"code\":\"sys03\"}],\"travel_theme\":\"测试002\",\"travel_start_time\":\"2017-08-08 10:07\",\"travel_end_time\":\"2017-08-22 10:07\",\"process_start_time\":\"2017-08-07 10:09:06\",\"process_end_time\":\"2017-08-07 10:28:46\"},{\"users\":[{\"name\":\"系统002\",\"code\":\"sys002\"}],\"travel_theme\":\"测试004\",\"travel_start_time\":\"2017-08-07 10:11\",\"travel_end_time\":\"2017-08-08 10:11\",\"process_start_time\":\"2017-08-07 10:12:34\",\"process_end_time\":\"2017-08-07 10:28:51\"}]";

ps : 这串 json 数据是我和一家外企做对接的部分数据 , 曾经搞火了和我做对接的小伙子
接下来我们分析这串 json
由外至内 , 如果将整体看作一个 Object , 那么由于最外端中括号的存在 , 它是一个 List, 这个 List 的泛型由两部分组成 , users 和 其他 , users 里面也是一个 List它包含了 name , code 字段, 所以我们的 javaBean 定义就显而易见了
每一个部分是一个类 , 最外层的类包含 users 类

import java.util.List;

public class TestGsonUnSer {
    private List users;
    private String travel_theme;
    private String travel_start_time;
    private String travel_end_time;
    private String process_start_time;
    private String process_end_time;    

    public List getUsers() {
        return users;
    }

    public void setUsers(List users) {
        this.users = users;
    }


    public String getTravel_theme() {
        return travel_theme;
    }

    public void setTravel_theme(String travel_theme) {
        this.travel_theme = travel_theme;
    }

    public String getTravel_start_time() {
        return travel_start_time;
    }

    public void setTravel_start_time(String travel_start_time) {
        this.travel_start_time = travel_start_time;
    }

    public String getTravel_end_time() {
        return travel_end_time;
    }

        public void setTravel_end_time(String travel_end_time) {
        this.travel_end_time = travel_end_time;
    }

    public String getProcess_start_time() {
        return process_start_time;
    }


    public void setProcess_start_time(String process_start_time) {
        this.process_start_time = process_start_time;
    }

    public String getProcess_end_time() {
        return process_end_time;
    }

    public void setProcess_end_time(String process_end_time) {
        this.process_end_time = process_end_time;
    }

    @Override
    public String toString() {
        return "TestGsonUnSer [users=" + users + ", travel_theme=" + travel_theme + ", travel_start_time="
                + travel_start_time + ", travel_end_time=" + travel_end_time + ", process_start_time="
                + process_start_time + ", process_end_time=" + process_end_time + "]";
    }

    public static class SonGson{
        private String name;
        private String code;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        @Override
        public String toString() {
            return "SonGson [name=" + name + ", code=" + code + "]";
        }           
     }
}

这里有几个注意的地方
1. 内部类必须为public static
2. 必须具有原生的不带参数的构造方法
3. 你的属性名应该和 json 字符串的键名一一对应

然后我们可以通过

List list = gson.fromJson(str, new TypeToken<List>(){}.getType());

很简单的将其转换为实体

测试

System.out.println(list.get(0).getUsers().get(0).getName());
输出:系统001

但是有些时候为了方便必须要将

List<TestGsonUnSer>

转换为更直观的 map , 将在下文中给出方案

你可能感兴趣的:(json数据)