普通的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 , 将在下文中给出方案