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

来源:互联网 发布:实验室数据评价 编辑:程序博客网 时间:2024/06/09 06:26

普通的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<Object>, 这个 List 的泛型由两部分组成 , users 和 其他 , users 里面也是一个 List<Object>它包含了 name , code 字段, 所以我们的 javaBean 定义就显而易见了
每一个部分是一个类 , 最外层的类包含 users 类

import java.util.List;public class TestGsonUnSer {    private List<SonGson> 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<SonGson> getUsers() {        return users;    }    public void setUsers(List<SonGson> 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<TestGsonUnSer> list = gson.fromJson(str, new TypeToken<List<TestGsonUnSer>>(){}.getType());

很简单的将其转换为实体

测试

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

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

List<TestGsonUnSer>

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

原创粉丝点击