Jackson反序列化泛型容器

1. 对于List反序列化

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

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

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

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

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

List list = JacksonUtil.json2BeanByType(jsonstr, new TypeReference>() {});
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 json2BeanByType(String jsonStr, TypeReference tr)
            throws IOException {
        return mapper.readValue(jsonStr, tr);
    }

    public static  T json2Bean(String jsonStr, Class clazz)
            throws IOException {
        return mapper.readValue(jsonStr, clazz);
    }

你可能感兴趣的:(Jackson反序列化泛型容器)