Я пытаюсь создать Java-пакет SDK для интерфейсной библиотеки, которая принимает вход JSON. По сути, этот SDK преобразует объекты определенного типа в JSON, который затем потребляется этой библиотекой переднего плана.Отсутствующее поле при десериализации с использованием Jackson (Polymorphic)
Я использую полиморфную сериализацию/десериализацию джексона с использованием его аннотационной системы.
У меня есть базовый класс A и 2 дочерних класса B и C, расширяющие A. Класс A имеет поле типа, с помощью которого я решаю, какой класс (B или C) должен использоваться. Синтаксис выглядит следующим образом: Так что теперь
@JsonTypeInfo({
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property= "type"
})
@JsonSubTypes({
@JsonSubTypes.Type(value = B.class, name = "b"),
@JsonSubTypes.Type(value = C.class, name = "c")
})
public class A {
private String type;
public void setType(String type){
this.type = type;
}
public String getType(){
return this.type;
}
}
public class B extends A {
}
public class C extends A {
}
, когда я использую readValue
функцию Джексона ObjectMapper
«s и читать строковой JSON и конвертировать в классе А, я получаю правильный экземпляр любого класса А или класса B на основе на значение переменной типа. Однако, и вот настоящая проблема, когда я пытаюсь использовать функцию getType
Я всегда получаю null
в этих объектах. Я не уверен, почему Джексон не устанавливает эти значения на объекте.
String json = "{ type: 'b' }"; // example input json
ObjectMapper om = new ObjectMapper();
A a = om.readValue(json, A.class);
// a is actually an instance of class B
a.getType()// this is null
спасибо, работает! не знаю, как я пропустил его в документации. – Rajan