Jackson / JAXB序列化List没有包装元素

时间:2013-01-18 19:24:02

标签: xml xml-serialization jackson jaxb2 adobe-analytics

我正在尝试使用Jackson's XML annotations将Map序列化为XML。我正在将Map转换为List,以便使用map键作为元素名称,将值用作元素值,并且我非常接近获得所需的XML。

我的班级看起来像:

@JacksonXmlRootElement(localName = "request")
public class TrackingEvent {
    private List<JAXBElement<String>> data = new ArrayList<JAXBElement<String>>();

    public TrackingEvent() {}

    public TrackingEvent addData(String key, String value) {
        data.add(new JAXBElement<String>(new QName(key), String.class, value));
        return this;
    }

    public Map<String, String> getData() {
        Map<String, String> dataAsMap = new HashMap<String, String>(data.size());
        for (JAXBElement<String> elem : data) {
            dataAsMap.put(elem.getName().getLocalPart(), elem.getValue());
        }
        return Collections.unmodifiableMap(dataAsMap);
    }
}

我的测试代码(快速脏,不是实际测试):

@RunWith(JUnit4.class)
public class TrackingEventMapperTest {

    @Test
    public void eventToXml() throws Exception {
        TrackingEvent e = new TrackingEvent().addData("eVar17", "woohoo");

        XmlMapper mapper = new XmlMapper();
        mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
        mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
        System.out.println("\n" + 
            mapper.writerWithDefaultPrettyPrinter().writeValueAsString(e));        
    }
}

这是它生成的XML:

<?xml version='1.0' encoding='UTF-8'?>
<request>
  <data>
    <eVar17>woohoo</eVar17>
  </data>
</request>

但我正在寻找的是:

<?xml version='1.0' encoding='UTF-8'?>
<request>
  <eVar17>woohoo</eVar17>
</request>

我尝试在数据声明及其getter中添加@JacksonXmlElementWrapper(useWrapping = false)注释,但似乎什么也没做。我可以更改元素的名称,将@JacksonXmlProperty(localName =“moop”)添加到声明/ getter中,但无法弄清楚如何将其完全删除。

我很确定我也可以通过阅读Jackson's docs来使用JAXB注释,但也没有通过Google找到任何内容。

正如您可能猜到的那样,我正在尝试创建一个表示Omniture数据的XML文档,并试图以我不必在POJO中明确包含它们的方式发送所有eVar和prop变量。

我的解决方案

我决定放弃对Jackson的任何使用,因为我需要的XML并不复杂,但迫使杰克逊做我想做的事情变得越来越复杂。我决定使用STAX2直接使用Jackson在封面下使用的相同实现来编写XML。这允许我根据需要自定义XML。

Blaise的回答看起来确实完全符合我的想法。

0 个答案:

没有答案