Problems marshalling a map in Jaxb

╄→尐↘猪︶ㄣ 提交于 2019-12-19 10:14:20

问题


I have a class world that contains a map of humans. If I marshal the class world I get following output:

<world>
    <humans>
        <human key="2">
            <value>
                <name>Tom</name>
            </value>
        </human>
        <human key="1">
            <value>
                <name>Max</name>
            </value>
        </human>
    </humans>
</world>

But I dont want to display the "value"-Tag. It should look like:

<world>
    <humans>
        <human key="2">
            <name>Tom</name>
        </human>
        <human key="1">
            <name>Max</name>
        </human>
    </humans>
</world>

Is this possible?

Here is the code of class world and human:

@XmlRootElement
public class Human {

    @XmlElement
    private String name;

    public Human(){}
}

@XmlRootElement
public class World {

    private Map<String, Human> humans = new HashMap<String, Human>();

    public World(){}

    @XmlElementWrapper( name = "humans")
    @XmlElement(name = "human")
    public HumanEntry[] getMap() {
        List<HumanEntry> list = new ArrayList<HumanEntry>();
        for (Entry<String, Human> entry : humans.entrySet()) {
            HumanEntry mapEntry =new HumanEntry();
            mapEntry.key = entry.getKey();
            mapEntry.value = entry.getValue();
            list.add(mapEntry);
        }
        return list.toArray(new HumanEntry[list.size()]);
    }

    public void setMap(HumanEntry[] arr) {
        for(HumanEntry entry : arr) {
            this.humans.put(entry.key, entry.value);
        }
    }

    public static class HumanEntry {
        @XmlAttribute
        public String key;

        @XmlElement
        public Human value;
    }

    public void addHuman(String key, Human human){
        this.humans.put(key, human);
    }
}

回答1:


As was pointed out by ilcavero an XmlAdapter can be used to apply an alternative mapping to Map (or any type) in JAXB. Below is a link to a concrete example:

  • http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html

For More Information

  • http://blog.bdoughan.com/search/label/XmlAdapter



回答2:


My solution

I added the key attribute to human and then I converted the map to an array:

@XmlRootElement
public class World {

    @XmlJavaTypeAdapter(HumanAdapter.class)
    private Map<String, Human> humans = new HashMap<String, Human>();

    public World(){}
}

public class Human {

    @XmlElement
    private String name;

    @XmlAttribute(name="key")
    private String key;

    public Human(){}
}

public class HumanAdapter extends XmlAdapter<HumanJaxbCrutch, Map<String, Human>> {

    @Override
    public HumanJaxbCrutch marshal(Map<String, Human> humans) throws Exception {
        List<Human> list = new ArrayList<Human>();
        for (Entry<String, Human> entry : humans.entrySet()) {
            list.add(entry.getValue());
        }

        HumanJaxbCrutch humanJaxbCrutch = new HumanJaxbCrutch();
        humanJaxbCrutch.setCourses(list.toArray(new Human[list.size()])); 

        return humanJaxbCrutch;
    }

    @Override
    public Map<String, Human> unmarshal(HumanJaxbCrutch humans) throws Exception {
        Map<String, Human> map = new HashMap<String, Human>();

        for(Human human : humans.getCourses()){
            map.put(human.getKey(), human);
        }

        return map;
    }
}

class HumanJaxbCrutch {

    private Human[] courses;

    @XmlElement(name = "human")
    public Human[] getCourses() {
        return courses;
    }

    public void setCourses(Human[] courses) {
        this.courses = courses;
    }
}



回答3:


I think you are looking for the XmlValue annotation : http://jaxb.java.net/tutorial/section_6_2_7_4-Mapping-a-Class-to-Simple-Content-or-Simple-Type-XmlValue.html#Mapping%20a%20Class%20to%20Simple%20Content%20or%20Simple%20Type:%20XmlValue

In your case it would be applied to HumanEntry.value instead of XmlElement



来源:https://stackoverflow.com/questions/7793283/problems-marshalling-a-map-in-jaxb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!