gson 可以作为 进行json obj 互转的工具 ,但最近使用它遇到了一些问题, 依赖如下
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
代码版本1:
如下: 我简单说明一下 方法作用,
方法入参是 quertion9 , 这是个 List< List<<Integer>> 类型 的二维集合 , 然后代码的作用是 把这个 二维集合里面的null 转成 0 , 逻辑也很简单 把新数组给返回 (其实我知道不用new 一个新数组 coll, 但是之前报错后想看看到底变成啥值才这么写的)
疑问信息如下:
可以看我框了的部分 , 不是nullnull
对比上面的代码 , 我产生了巨大的疑问 , 我再代码中定义的 方法入参 question9 明明是 List<List<lnteger>>
类型 !!!
而且再这个日志输出之前 , 我有个 if 判断 如果 过去到 等于 null ,那就给它 add成0 .
我明白有人可能会说 ,这个日志打印的null 是 ‘null’ 字符串
问题是: List<Ingeger> 数组 里面还能装 除了数字, null 之外的其它类型吗 ??? (后面其实是有可能的, 但是这里这个确实不是null 字符串)
我还特意试了下,Integer 能不能定义字符串. 显然不能
存留着这个疑问, 我对上面代码进行了改造. 但还是出问题了 , 直接看日志报错图吧.
报错信息如下:
报错代码如下 , 可以看到 是1700 行报的错 .
这里我判断 通过 list.get(i1)
时, 得到了一个 jsonObject 类型的值 ( jsonObject 类型的null ,,,
), 然后跟后面的数字0 判定时报错了…
我当时想,既然是jsonObject类型的null ,那我再用 instanceof
判断类型, 但貌似不能这么写
随后, 我又换了一种写法.
这样写貌似是可行的 , 但是结果还是跟上面日志一样报 jsonObject 不能转换成 Integer , 这个日志图我没有截下来…
最后 , 我把代码改成了如下
private List<List<Integer>> formatQ9(List<List<Integer>> question9) {
log.info("before question9 {}", question9 );
for (List<Integer> list : question9) {
for (int i1 = 0; i1 < list.size(); i1++) {
if (list.get(i1) != null){
try {
if (list.get(i1) == 1){
//有坑才这么写
}
}catch (Exception e){
list.set(i1,0);
}
}else{
list.set(i1,0);
}
}
}
log.info("after formatQ9 {}", question9);
return question9;
}
这个问题才解决.
这又让我引入了一个思考点 , 后面了解 List<Integer>
确实可以存任意类型的 , 这个东西叫 泛型擦除 (感觉这东西搭配 gson 的序列化 则坑, 序列化前后类型都变了)
下图1: 可以给 入参为 List<integer>
传任意类型
如图: 通过反射亦可以传任意类型
再贴一下我用的 gsonUtils (坑爹玩意 要不是 fastjson 老是出漏洞 , 早就想换它了)
package com.cmbi.prodtrad.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.awt.*;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class GsonUtil {
private static Gson filterNullGson;
private static Gson nullableGson;
static {
nullableGson = new GsonBuilder()
.enableComplexMapKeySerialization()
.serializeNulls()
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.create();
filterNullGson = new GsonBuilder()
.enableComplexMapKeySerialization()
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.create();
}
protected GsonUtil() {
}
/**
* 根据对象返回json 不过滤空值字段
*/
public static String toJsonWtihNullField(Object obj){
return nullableGson.toJson(obj);
}
/**
* 根据对象返回json 过滤空值字段
*/
public static String toJsonFilterNullField(Object obj){
return filterNullGson.toJson(obj);
}
/**
* 将json转化为对应的实体对象
* new TypeToken<HashMap<String, Object>>(){}.getType()
*/
public static <T> T fromJson(String json, Type type){
return nullableGson.fromJson(json, type);
}
public static Map<String,Object> transferToMap(String json) {
return nullableGson.fromJson(json,
new TypeToken<Map<String, Object>>() {
}.getType());
}
}