com.fasterxml.jackson.databind.exc.UnrecouncedPropertyException: нераспознанное поле «поле» (класс com.mapper.example.Parent)
У меня возникла проблема с десериализацией: пытаюсь преобразовать класс, расширяющий родительский класс. Пожалуйста, найдите мой класс ниже,
public class Base {
Parent parent;
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
-----------------
public class Parent {
String name;
String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
-----------------
public class Child extends Parent {
String field;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
Основной метод:
public class TestDeserial {
public static void main(String[] args) {
Child c = new Child();
c.setName("test1");
c.setCity("Mumbai");
c.setField("allow");
Base b = new Base();
b.setParent(c);
// Convert object to json
File file = new File("C:\\temp\\c.json");
try {
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(file, b);
} catch (IOException e) {
e.printStackTrace();
}
// Convert json to object
Base baseResult = null;
try (InputStream in = new FileInputStream("C:\\temp\\c.json")) {
ObjectMapper objMapper = new ObjectMapper();
baseResult = objMapper.readValue(in, Base.class);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
Ошибка: com.fasterxml.jackson.databind.exc.UnrecouncedPropertyException: нераспознанное поле «поле» (класс com.mapper.example.Parent), не помеченное как игнорируемое (2 известных свойства: «имя», «город»]) в [ Источник: (FileInputStream); строка: 1, столбец: 52] (через цепочку ссылок: com.mapper.example.Base["parent"]->com.mapper.example.Parent["field"])
Я не хочу добавлять какие-либо аннотации в файл класса.
1 ответ
Вам нужно сказать Джексону, чтобы он использовал вывод, основанный на дедукции, для определения соответствующего подкласса. Джексон проверит поля в JSON и сравнит их с полями в подклассах.
Если вы не хотите добавлять аннотации к исходным классам, вы можете использовать примеси, например:
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({ @JsonSubTypes.Type(Child.class) })
public abstract class ParentMixin {}
а затем просто зарегистрируйте его в своем ObjectMapper (тот, который используется для десериализации):
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Parent.class, ParentMixin.class);