关于使用 com.google.gson.Gson 序列化类型变了的坑 Cause:java.lang.ClassCastException: net.sf.json.JSONObject cann

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());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值