Как я могу запретить Джексону сериализовать свойство аннотации полиморфного типа? - PullRequest
13 голосов
/ 29 апреля 2011

У меня есть полиморфные типы и десериализация из JSON в POJO. Я следовал документации здесь , на самом деле. При сериализации POJO в JSON я получаю нежелательный атрибут, в частности имя логического типа.

import static org.codehaus.jackson.annotate.JsonTypeInfo.*;

@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="type")
@JsonSubTypes({
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat")
})    
public class Animal { ... }

public class Dog extends Animal { ... }
public class Cat extends Animal { ... }

Когда Джексон сериализуется в JSON, он предоставляет информацию о типе, которую я не хочу раскрывать.

{"type":"dog", ... }
{"type":"cat", ... }

Могу ли я как-то предотвратить это? Я только хочу игнорировать type при десериализации.

Ответы [ 2 ]

5 голосов
/ 14 июня 2011

Простым решением было бы просто переместить конфиги @JsonTypeInfo и @JsonSubTypes в MixIn, а затем зарегистрировать только MixIn для десериализации.

mapper.getDeserializationConfig().addMixInAnnotations(MyClass.class, MyMixIn.class)

1 голос
/ 09 июня 2017

Это заняло у меня много времени, поэтому я решил поделиться.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = false, property = "type")

visible=false гарантирует, что если свойство type существует в классе, оно не будет заполнено значением type во время десериализации.

include = JsonTypeInfo.As.EXISTING_PROPERTY диктует, что если свойство type существует, используйте это значение во время сериализации, иначе ничего не сделайте.

Итак, все вместе:

import static org.codehaus.jackson.annotate.JsonTypeInfo.*;

@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, visible = false, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat")
})    
public class Animal { ... }

public class Dog extends Animal { ... }
public class Cat extends Animal { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...