JAXB在没有适配器的情况下编组地图

时间:2014-05-30 07:04:54

标签: java jaxb

我有一张地图,我想把它整理成XML。只要有大量不同类型的地图,我真的不想为每个地图编写自定义的XmlAdapter。 我为我用作键的所有类都有XmlAdapters。当我独立编组这些类时,它们可以很好地工作,但是当我编组地图时,键被忽略了。我得到的是以下XML:

<entry>
    <key/>
    <value>
        <id>1</id>
        <property>something</property>
    </value>
</entry>

我想要的是:

<entry>
    <key>
        <property>something</property>
    </key>
    <value>
        <id>1</id>
        <property>something</property>
    </value>
</entry>

有没有办法在不为每张地图编写自定义XmlAdapter的情况下获得所需的结果?

1 个答案:

答案 0 :(得分:0)

您无需使用JAXB和java.util.Map做任何特别的事情。我将在下面举例说明。

Java模型

<强>富

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Foo {

    private Map<Bar, Bar> bars = new HashMap<Bar, Bar>();

    public Map<Bar, Bar> getBars() {
        return bars;
    }

    public void setBars(Map<Bar, Bar> bars) {
        this.bars = bars;
    }

}

<强>酒吧

public class Bar {

    private String baz;

    public String getBaz() {
        return baz;
    }

    public void setBaz(String baz) {
        this.baz = baz;
    }

}

演示代码

<强>演示

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();

        Bar bar1 = new Bar();
        bar1.setBaz("Hello");

        Bar bar2 = new Bar();
        bar2.setBaz("World");

        foo.getBars().put(bar1, bar2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

<强>输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bars>
        <entry>
            <key>
                <baz>Hello</baz>
            </key>
            <value>
                <baz>World</baz>
            </value>
        </entry>
    </bars>
</foo>

更多信息

我在博客上写了更多关于JAXB和java.util.Map的文章: