您的位置:首页 > Web前端 > JavaScript

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

2017-08-10 21:40 357 查看
普通的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 , 将在下文中给出方案
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json