如何使用 Jackson Databind 反序列化嵌套的泛型类?

Ism*_*ros 2 java generics json jackson deserialization

我想使用 Jackson 的对象映射器将 JSON 反序列化为通用类(例如 Foo)。首先,我使用这个:

JavaType type = mapper.getTypeFactory().constructParametricType(valueType, valueInnerType);
Foo<Bar> response = mapper.readValue(inStream, type);
Run Code Online (Sandbox Code Playgroud)

当一切都打好后,一切都很好!但我想概括反序列化这些对象的方法。比如我想用同样的方法反序列化一个Foo2类的对象和一个Foo类的对象,一切都用同样的方法。

我可以做两种通用方法:

public <T> T deserialize(Stream inStream, Class<T> classLiteral);
public <T, TInner> ??? deserialize(Stream inStream, Class<T> classLiteral, Class<TInner> innerClassLiteral);
Run Code Online (Sandbox Code Playgroud)

但我不知道是什么类型,我应该返回。

这是正确的方法吗?或者有更好的方法来做到这一点?

JND*_*ial 5

如果你想写一个通用的方法来使用 Jackson Databind 反序列化嵌套的泛型类,你可以像这样使用 TypeReference 对象:

public <T> T deserialize(Stream inStream, TypeReference<T> typeReference){
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(inStream, typeReference);
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以像这样使用它:

Foo<Bar> response = deserialize(inStream, new TypeReference<Foo<Bar>>(){});
Run Code Online (Sandbox Code Playgroud)

因此,通过 TypeReference Object,您可以编写通用方法,并且可以通过 TypeReference 传递泛型类和内部类。

如果您想阅读更多相关信息,可以在此链接中找到有关 TypeReference 的一些示例:

https://www.programcreek.com/java-api-examples/org.codehaus.jackson.type.TypeReference