栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JSON反序列化泛型丢失问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JSON反序列化泛型丢失问题

一、问题描述

最近开发业务中遇到一个有趣的问题,我本来是想提取一个公共的抽象类,完成从redis缓存中获取到json后进行反序列化成继承类的泛型对象,这个泛型类是List,在反序列化时,list类型是正常的,但是list里的对象却不正确。

原本实现:

	@Test
    public void run1(){
        var userService = new UserService();
        var json = """
                [
                    {"name":"张三","age":12},
                    {"name":"李四","age":17}
                ]
                """;
        List users = userService.json2Pojo(json);
        User user = users.get(0); // 这里会报错,因为类型不匹配,集合中的对象类型是LinkedHashMap
        System.out.println(users);
    }

    //实现类
    class UserService extends AbstractService>{
    }
    //抽象类
    abstract class  AbstractService{
        public final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
        public T json2Pojo(String json){
            try {
                return OBJECT_MAPPER.readValue(json, new TypeReference() {
                });
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    //对象
    @Data
    static class User{
        private String name;
        private Integer age;
    }

测试代码中的反序列化集合users返回结构是:

注意这里的类型原本应该是User,但是却变为了LinkedHashMap
这里我使用的json工具是jackson,以为是因为这个框架不支持导致的泛型丢失,然后尝试使用Gson,结果也是一样的。

二、解决方案 1、json反序列化交给实现类完成

这是下下策,因为已经提取抽象类了,我们就是要减少实现类的开发,虽然这样没有太多的开发代码,但是总归感觉别扭,不建议这样实现

2、通过spring工具获取泛型类型,然后反序列化
	abstract class  AbstractService{
        public final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
        // 通过spring工具获取泛型类型
        private final JavaType JAVA_TYPE = TypeFactory
                .defaultInstance()
                .constructType(ResolvableType.forClass(this.getClass()).getSuperType().getGeneric(0).getType());
        public T json2Pojo(String json){
            try {
                Object o = OBJECT_MAPPER.readValue(json, JAVA_TYPE);
                return (T) o;
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

这里users集合中的对象已经是User对象了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1014676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号