放弃不难,但坚持一定很酷。——《解忧杂货店》
今天使用 Jackson 有个疑问,就是带范型的对象,Jackson 序列化后,范型会怎样处理:
就比如说{"data":{"data":1}},以及下面这个类:
@Data
public static class Foo<T> {
private T data;
}这个外层的 data 会反序列化出来什么类型呢?
实际上反序列化出来 LinkedHashMap
var obj = mapper.readValue("""
{"data":{"data":1}}
""", Foo.class);
Assertions.assertEquals(LinkedHashMap.class, obj.getData().getClass());如果我们需要继续解析成具体的类型,则可以使用 convertValue 简洁调用
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.Data;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.LinkedHashMap;
/**
* JsonUtilsTest
*
* @author achao@apache.org
*/
class JsonUtilsTest {
ObjectMapper mapper = new ObjectMapper();
@Test
void testGenericType() throws JsonProcessingException {
var obj = mapper.readValue("""
{"data":{"data":1}}
""", Foo.class);
Assertions.assertEquals(LinkedHashMap.class, obj.getData().getClass());
var foo = mapper.convertValue(obj.getData(), Foo.class);
Assertions.assertEquals(1, foo.getData());
}
@Data
public static class Foo<T> {
private T data;
}
}