Jackson反序列化泛型容器

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);
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java中的RPC(远程服务调用)可以通过序列化的方式进行。 JDK英文文档,墙裂不推荐看中文!!![https:...
    小胖学编程阅读 11,564评论 0 6
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,235评论 0 3
  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 4,685评论 0 3
  • 注:都是在百度搜索整理的答案,如有侵权和错误,希告知更改。 一、哪些情况下的对象会被垃圾回收机制处理掉  当对象对...
    Jenchar阅读 8,442评论 3 2
  • iOS动画篇之CoreAnimation动画 9月 22, 2016发布在Objective-C App如果想被大...
    白水灬煮一切阅读 6,572评论 0 0