使用jackson-dataformat-xml重写ArrayList XML序列化

时间:2015-11-28 10:03:54

标签: java xml serialization jackson jackson-dataformat-xml

如果我使用jackson-dataformat-xml序列化JsonNode的ArrayList,它会产生以下结果:

<ArrayList><item>...</item><item>...</item></ArrayList>

我想读一读:

<events><event>...</event><event>...</event></events>

我已经尝试过使用自定义序列化程序并确实为我提供了我想要的<event/>标记,但它仍然包含了<ArrayList><item></item></ArrayList>

中的所有内容
public class ArrayListSerializer extends JsonSerializer<ArrayList<JsonNode>> {

    @Override
    public void serialize(ArrayList<JsonNode> value, JsonGenerator gen,
            SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeStartObject();

        for (JsonNode node : value) {
            gen.writeObjectField("event", node);
        }

        gen.writeEndObject();
    }

    @Override
    public Class<ArrayList<JsonNode>> handledType() {
        @SuppressWarnings("unchecked")
        Class<ArrayList<JsonNode>> typeClass = (Class<ArrayList<JsonNode>>)(Class<?>)List.class;
        return typeClass;
    }
}

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:1)

您还可以考虑使用annotations定义XML元素名称。这是一个例子:

public class JacksonXmlArray {
    static class Document {
        @JsonProperty
        @JacksonXmlElementWrapper(localName = "events")
        @JacksonXmlProperty(localName = "event")
        List<String> events = Arrays.asList("a", "b");
    }
    public static void main(String[] args) throws JsonProcessingException {
        final XmlMapper xmlMapper = new XmlMapper();
        System.out.println(xmlMapper.writeValueAsString(new Document()));
    }
}

输出:

<Document xmlns=""><events><event>a</event><event>b</event></events></Document>