2016-09-19 5 views
0

Существует абстрактный класс Product и еще один класс SomeProduct, который расширяет Product.Десериализация через джексон не выполняется с родительскими/дочерними классами

Product:

@JsonTypeInfo 
(
use = JsonTypeInfo.Id.NAME, 
include = JsonTypeInfo.As.PROPERTY, 
property = "type" 
) 
@JsonSubTypes 
({ 
    @JsonSubTypes.Type(value = SomeProduct.class, name = Product.PRODUCT_TYPE_SOME) 
}) 
public abstract class Product 
{ 
    static final String PRODUCT_TYPE_SOME = "some_product"; 
} 

SomeProduct:

public class SomeProduct extends Product 
{ 
    @JsonProperty("status") 
    @JsonSerialize(include = JsonSerialize.Inclusion.NON_DEFAULT) 
    private int status; 

    public int getStatus() 
    { 
     return status; 
    } 

    public void setStatus(int status) 
    { 
     this.status = status; 
    } 
} 

Там будет больше классов (различные продукты), которые проходят Product.

Когда я сериализовать его с помощью ObjectMapper,

ObjectMapper mapper = new ObjectMapper(); 

Product p = new SomeProduct(); 
String json = mapper.writeValueAsString(p); 

это выход:

{ "типа": "some_product"}

Теперь, когда я пытаюсь десериализовать его обратно,

Product x = mapper.convertValue(json, Product.class); 

это исключение:

java.lang.IllegalArgumentException: Неожиданный маркер (VALUE_STRING), ожидаемый FIELD_NAME: отсутствует свойство 'тип', который должен содержать идентификатор типа (для класса com.shubham.model.Product) at [Источник: N/A; строка: -1, столбец: -1]

Что я здесь делаю неправильно? Я посмотрел на SO и нашел вопрос, где defaultImpl был использован в JsonTypeInfo. Но я не могу десериализовать json обратно в «Default Impl», поскольку JSON всегда будет действителен для конкретной реализации.

Использование Джексон 2.4.3

+2

Может ли это быть проблемой? http://stackoverflow.com/a/14228184/4793951 – Zircon

+0

@ Zircon Как упоминалось в фрагменте кода, я указал только «JsonTypeInfo.Id.NAME». Кроме того, «JsonTypeInfo» устанавливается только в базовом классе, а не в подклассах. –

ответ

3

Вы неправильно используя mapper.convertValue(json, Product.class);. Вы должны использовать: mapper.readValue(json, Product.class);

convertValue использование:

Удобный метод делает преобразование два этапа из заданного значения, в экземпляр данного типа значения, преобразование, если (! Но только если) не требуется. Если заданное значение уже запрошено, значение возвращается как есть.

+0

Спасибо, это была именно проблема. –

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