【问题标题】:Jackson serialization using JsonTypeInfo WRAPPER_OBJECT杰克逊序列化使用 JsonTypeInfo WRAPPER_OBJECT
【发布时间】:2015-06-13 15:37:09
【问题描述】:

我正在尝试通过以下方式使用 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),我可以将类名设置为包装对象。是否可以消除 &lt;animal/&gt; 包装器并生成以下格式的 XML:

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

【问题讨论】:

  • 这是列表的名称,所以你不能这样做。您正在尝试破坏序列化规则。
  • 感谢您的回复...由于我们正在添加 WRAPPER_OBJECT,因此使用 @JsonTypeInfo,不需要列表包装​​器。这可以在 JAXB 中使用 @XmlElements({ @XmlElement() }) 注释来实现。想知道我们是否可以在 Jackson 中实现这一点(也许通过实现自定义序列化?)。请分享您的想法...

标签: java xml serialization jackson


【解决方案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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多