2013-10-15 4 views
11

ObjectMapperreadValue(InputStream in, Class<T> valueType) Функция требует класса. Но как я могу использовать его, если класс, который я передаю внутри, имеет некоторый интерфейс в качестве члена данных.Как десериализировать поля интерфейса с помощью объекта объекта объекта Jackson?

хотя я могу понять причину этого исключения, поскольку Джексон не получает конкретный класс внутреннего интерфейса пройденного класса, но мой вопрос заключается в том, как его разрешить? как я его десериализую? Класс Я пытаюсь десериализации это:

class BaseMetricImpl<N> implements Metric<N> { 
    protected MetricValueDescriptor descriptor; 
} 

Здесь MetricValueDescriptor представляет собой интерфейс, так что это дает мне следующую ошибку: -

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MetricValueDescriptor, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information 
at [Source: [email protected]; line: 1, column: 2] (through reference chain: SingleValueMetricImpl["descriptor"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:624) 
    at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:115) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:308) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2793) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1989) 
+0

Можете ли вы обновить свой пример кода и завершить ошибку stacktrace. – vels4j

+0

@ vels4j Я отредактировал вопрос, чтобы поместить небольшой образец кода и исключение – Naman

ответ

27

Джексон явно не может построить MetricValueDescriptor объект, так как он является интерфейсом. Вам нужно будет получить дополнительную информацию в вашем json и в ObjectMapper, чтобы сообщить джексону, как построить объект из него. Вот один из способов сделать это, предполагая, что MVDImpl является конкретным класс, который реализует MetricValueDescriptor:

Вы можете сказать Джексон информации требуемого типа через поле в самом формате JSON, скажет "type". Для этого вам необходимо использовать аннотации JsonTypeInfo и JsonSubTypes в вашем интерфейсе. Например,

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @Type(value = MVDImpl.class, name = "mvdimpl") }) 
interface MetricValueDescriptor 
{ 
    ... 
} 

Вам нужно будет добавить "type":"mvdimpl" поле в формате JSON, а также.

Я собирался указать вам на official doc для получения дополнительной информации, но затем я нашел отличный блог, посвященный этой теме - Deserialize JSON with Jackson. Он охватывает эту тему довольно подробно и с примерами. Поэтому вам обязательно нужно прочитать его, если вам нужна дополнительная настройка.

+2

У меня возникла такая же проблема, однако, класс «Суперкласс» не принадлежит мне, его нельзя изменить. В этом случае, как мы можем позволить карте «Джексона» правильно «подкласс»? – lvarayut

+1

@lvarayut Вы можете использовать [Аннотации Джексона Мичина] (http://wiki.fasterxml.com/JacksonMixInAnnotations), чтобы добавлять аннотации к немодифицируемым классам. – mucaho

+0

Другой способ (бит более задействован) - использовать так называемую «типичную типизацию», включенную через «ObjectMapper». Это позволит включить включение информации типа для категорий классов без аннотаций. По умолчанию есть несколько вариантов, таких как «все небетонные типы», «все нефинальные типы», но вы также можете реализовать свою собственную стратегию. – StaxMan

Смежные вопросы