2015-04-08 3 views
0

Я пытаюсь установить имя подкласса в качестве имени элемента XML в сериализованном XML-контенте, используя Джексон следующим образом.Сериализация Джексона с использованием JsonTypeInfo WRAPPER_OBJECT

public interface Animal { 
    public String getName(); 
} 

public class Dog implements Animal { 
    private String name; 
    public String getName(){ 
     return name; 
    } 
} 

public class Cat implements Animal { 
    private String name; 
    public String getName(){ 
     return name; 
    } 
} 

public class Zoo { 
    @JacksonXmlElementWrapper(useWrapping = false) 
    @JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NAME) 
    private List<Animal> animals; 
    // getters and setters 
} 

Результат:

<Zoo> 
    <animals> 
     <Dog> 
      <name>xyz</name> 
     </Dog> 
    </animals> 
    <animals> 
     <Cat> 
      <name>abc</name> 
     </Cat> 
    </animals> 
</Zoo> 

Добавляя @JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NAME), я могу установить имя класса в качестве объекта оболочки. Можно ли устранить <animal/> обертку и генерировать XML в формате ниже:

<Zoo> 
    <Dog> 
     <name>xyz</name> 
    </Dog> 
    <Cat> 
     <name>abc</name> 
    </Cat> 
</Zoo> 
+0

Это имя списка, поэтому вы не можете этого сделать. Вы пытаетесь нарушить правила сериализации. – mtyurt

+0

Спасибо за ваш ответ ... Поскольку мы добавляем WRAPPER_OBJECT, используя @JsonTypeInfo, оболочка списка не требуется. Это может быть достигнуто в JAXB с помощью @XmlElements ({@XmlElement()}) аннотаций. Интересно, можем ли мы добиться этого в Джексоне (возможно, путем реализации пользовательской сериализации?). Поделитесь своими мыслями ... – dinup24

ответ

1

я смог найти ответ сам. Мы можем добиться этого, используя специальный сериализатор, как показано ниже.

public class Zoo { 
    @JacksonXmlElementWrapper(useWrapping = false) 
    @JsonSerialize(using=AnimalListSerializer.class) 
    private List<Animal> animals; 
    // getters and setters 
} 

public class AnimalListSerializer extends JsonSerializer<List<Animal>> { 
    @Override 
    public void serialize(List<Animal> value, JsonGenerator jgen, 
      SerializerProvider provider) throws IOException, 
      JsonProcessingException { 

     for (Animal me : value) { 
      provider.defaultSerializeField(me.getClass().getName(), me, 
        jgen); 
     } 
    } 
} 
Смежные вопросы