Джексон игнорирует аннотации во время сериализации

avatar
maciejka
9 августа 2021 в 07:11
120
1
0

У меня есть следующая структура для сериализации

@JsonTypeName("DS")
public class Elemencik implements IC {

    private String item;

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public Elemencik() {
    }
}

@JsonTypeInfo(use= JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
        @JsonSubTypes.Type(Elemencik.class)
})
public interface IC {
}

Я использую ObjectMapper для сериализации экземпляра класса Elemencik.

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.USE_ANNOTATIONS, true);
IC mm = new Elemencik();
String res = mapper.writeValueAsString(mm);

После сериализации я вижу, что преобразователь обрабатывает информацию о типе, включенном в аннотацию @JsonTypeName("DS"). Итак, окончательный json не имеет типа поля. Это мой pom.xml

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.1</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.11.1</version>
</dependency>

В чем может быть проблема?

Источник

Ответы (1)

avatar
hatef alipoor
9 августа 2021 в 09:28
2

Я думаю, у вас проблема с import, если ваш импорт

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

тогда он не может сериализовать поле типа, и у вас есть эта строка:

{"item":null}

но если ваш импорт:

import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

и код:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.USE_ANNOTATIONS, true);
IC mm = new Elemencik();
String res = mapper.writeValueAsString(mm);

он может сериализовать поле типа, и у вас есть следующая строка:

{"type":"DS","item":null}