在使用Json格式的数据进行方法操作时,都会经历数据转换的过程,Gson和FastJson都是很不错的转换工具,这次使用的项目主要要到了Gson来进行数据的转换。
首先数据的格式大致是下图所示,是一组不带数据头的简单Json串,需求就是获得Json串内的hostId的值
[
{
"setTime": {
"time": 1528214400000,
"minutes": 0,
"seconds": 0,
"hours": 0,
"month": 5
},
"sCurrDateEnd": "",
"createTime": null,
"model": "KH-MT-M5/M100",
"supplierId": 0,
"frequency": "24",
"type": "43",
"id": 19,
"principalId": 0
}
]
处理的代码段如下
//获得json串并转换为String
Map<String, Object> resultMap = iEquipMaintain.findInfoByReserveMaintainTime();
String str1 = (String) resultMap.get("equipMaintain");
//创建Json的解析类对象
JsonParser parser = new JsonParser();
//将JSON的String 转成一个JsonArray对象
JsonArray array = parser.parse(str1).getAsJsonArray();
List<String> hostIdList = new LinkedList<String>();
//遍历array,获得多个hostId(得到多个json数据的情况下)
for (int i = 0; i < array.size(); i++) {
//JsonElement是一个抽象类,代表 JSON 串中的某一个元素,可以是 JsonObject/JsonArray/JsonPrimitive/… 中的任何一种元素
JsonElement hostId = array.get(i).getAsJsonObject().get("hostId");
hostIdList.add(hostId.toString());
}
System.out.println(hostIdList);
主要代码逻辑是:
1. 将得到的Json串转换为String
2. 创建一个Json解析类的对象,将String转换为JsonArray
3. 遍历JsonArray,获得想要的对象
在调用接口时,我发现有的接口传过来的json串不只是单纯的数组对象,数据还包括了数据头,也就是在方括号前面还加了一个名称,如下所示
"equipMaintain" : [
{
"setTime": {
"time": 1528214400000,
"minutes": 0,
"seconds": 0,
"hours": 0,
"month": 5
},
"sCurrDateEnd": "",
"createTime": null,
"model": "KH-MT-M5/M100"
"supplierId": 0,
"frequency": "24",
"type": "43",
"id": 19,
"principalId": 0,
}
]
我在第一种转换写法上是使用了map的get(key)方法直接拿到了equipMaintain后面的数据,实际上可以直接在第一种的方式下修改
JsonArray array = parser.parse(str1).getAsJsonArray("equipMaintain");
也可以是
//先转JsonObject
JsonObject jsonObject = new JsonParser().parse(str1).getAsJsonObject();
//再转JsonArray 加上数据头
JsonArray jsonArray = jsonObject.getAsJsonArray("equipMaintain");
Gson gson = new Gson();
ArrayList<EquipMaintainVo> maintainList = new ArrayList<>();
//循环遍历
for (JsonElement eqm : jsonArray) {
//通过反射 得到UserBean.class
EquipMaintainVo equipMaintainVo = gson.fromJson(eqm, new TypeToken<EquipMaintainVo>() {}.getType());
maintainList.add(equipMaintainVo);
}
关键点在于引入了com.google.gson.reflect.TypeToken这个包,TypeToken 是一个匿名内部类,Gson 提供了 TypeToken 这个类来帮助我们捕获(capture)像 List 这样的泛型信息。Java编译器会把捕获到的泛型信息编译到这个匿名内部类里,然后在运行时就可以被 getType() 方法用反射的 API 提取到。通俗地讲就是通过调用这个类,可以将EquipMaintainVo这个由泛型T引入的类变成EquipMaintainVo.class。
上面两种方法都是在面对不同的场景时使用的不同方法,而且也是较为复杂的方法(有点绕远路的感觉)实际上,Gson提供了更为简便的方法,就是直接解析成对象的方式,例如下面这个复杂的json串
{
"RTN_CODE": "000000",
"RTN_MSG": "查询成功",
"equipMaintain": [{
"setTime": {
"time": 1528214400000,
"minutes": 0,
"seconds": 0,
"hours": 0,
"month": 5
},
"sCurrDateEnd": "",
"createTime": null,
"type": "43",
"id": 19,
"principalId": 0,
}]
}
这样的Json串转换的代码只需要一行就够了,这也就是Gson的强大之处,直接通过fromJson()方法,将Json串转换为equipMaintainVo 对象,再使用对象的getMuser()方法拿到集合,这里的EquipMaintainVo.class这个参数也是和上面使用typeToken转换泛型一个道理。
//GSON直接解析成对象
EquipMaintainVo equipMaintainVo = new Gson().fromJson(str1,EquipMaintainVo.class);
//对象中拿到集合
List<EquipMaintainVo> equipMaintainVoList = equipMaintainVo.getMuser();
以上就是基础的使用Gson进行数据转换的做法