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);
}
网友评论