Существует абстрактный класс 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
Может ли это быть проблемой? http://stackoverflow.com/a/14228184/4793951 – Zircon
@ Zircon Как упоминалось в фрагменте кода, я указал только «JsonTypeInfo.Id.NAME». Кроме того, «JsonTypeInfo» устанавливается только в базовом классе, а не в подклассах. –