使用Gson进行数据格式的转换

在使用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进行数据转换的做法

猜你喜欢

转载自blog.csdn.net/qq_36182135/article/details/81347458