我正在尝试使用Jackson以下列方式将子类名称设置为序列化XML内容中的XML元素名称。
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 :(得分: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);
}
}
}