Как десериализовать вложенный универсальный класс с помощью Jackson Databind? - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу десериализовать JSON в общий класс (например, Foo), используя Object Mapper Джексона. Во-первых, я использую это:

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

Когда все набрано, все хорошо! Но я хочу обобщить метод десериализации этих объектов. Например, с помощью того же метода я хочу десериализовать объект класса Foo2 и объект класса Foo, все с одним и тем же методом.

Я мог бы сделать два общих метода:

public <T> T deserialize(Stream inStream, Class<T> classLiteral);
public <T, TInner> ??? deserialize(Stream inStream, Class<T> classLiteral, Class<TInner> innerClassLiteral);

Но я не знаю, какого типа, я должен вернуться.

Это правильный путь? Или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 15 сентября 2018

Если вы хотите написать общий метод для десериализации вложенного универсального класса с помощью Jackson Databind, вы можете использовать объект TypeReference следующим образом:

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

и в вашем случае вы можете использовать его так:

Foo<Bar> response = deserialize(inStream, new TypeReference<Foo<Bar>>(){});

Таким образом, с помощью TypeReference Object вы можете написать общий метод и передать свой универсальный класс и внутренний класс по TypeReference.

Если вы хотите узнать больше об этом, вы можете найти образец о TypeReference по этой ссылке:

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

...