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);
Другие вопросы по тегам