杰克逊序列化使用JsonTypeInfo WRAPPER_OBJECT

时间:2015-04-08 15:17:44

标签: java xml serialization jackson

我正在尝试使用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>

1 个答案:

答案 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);
        }
    }
}