美文网首页
Jackson反序列化泛型容器

Jackson反序列化泛型容器

作者: geekMole | 来源:发表于2019-07-28 13:15 被阅读0次

    1. 对于List<MyEntity>反序列化

    由于jvm运行时对泛型处理的问题, java并不支持List<MyEntity>.class这样来获取class所以调用ObjectMapper.readValue(jsonStr, clazz)方法将无法实现; 如果强行做如下调用:

    ObjectMapper mapper = new ObjectMapper();
    String jsonstr = "[{\"name\":\"name1\"},{\"name\":\"name2\"},{\"name\":\"name3\"}]";
    List<MyObject> list = mapper.readValue(jsonStr, List.class);
    System.out.println(list.get(0).getName());
    

    将会在试图读取MyObject对象的方法时报运行时错误, 这是jvm运行时对泛型容器处理的问题. 实际上上面代码反序列化得到的list是List<LinkedHashMap>;

    2. 一种解决反序列化泛型容器问题的封装

    反序列化提供两种对外方法, 一种是Class, 一种是TypeReference,
    使用的时候如果遇到(当然其他类型也可以用这个方法只是太麻烦不是吗)List<>只需:

    List<JobEntity> list = JacksonUtil.json2BeanByType(jsonstr, new TypeReference<List<JobEntity>>() {});
    
    package com.feng.util;
    
    import com.feng.entity.JobEntity;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.IOException;
    import java.util.List;
    
    /**
     * @Auther: feng
     * @Date: 2019/7/28 12:09
     * @Description:
     */
    public class JacksonUtil {
        private static ObjectMapper mapper = new ObjectMapper();
    
        public static String bean2Json(Object obj) throws IOException {
    
            return mapper.writeValueAsString(obj);
        }
    
        public static <T> T json2BeanByType(String jsonStr, TypeReference tr)
                throws IOException {
            return mapper.readValue(jsonStr, tr);
        }
    
        public static <T> T json2Bean(String jsonStr, Class<T> clazz)
                throws IOException {
            return mapper.readValue(jsonStr, clazz);
        }
    

    相关文章

      网友评论

          本文标题:Jackson反序列化泛型容器

          本文链接:https://www.haomeiwen.com/subject/bwwurctx.html