JAXB java.util.Map绑定

我有一个Json响应,如下所示:

{ "data": [ { "param1": "value1", "param2": "value2", . . . "paramN": "valueN" } ] } 

我不知道参数的名称和数量。 所以,我需要并希望将所有这些参数绑定到由元组组成的java.util.Map字段。 为此,我尝试了以下代码,但“parametersMap”字段返回null。

 @XmlRootElement(name="data") @XmlAccessorType(XmlAccessType.FIELD) public class Parameters { @XmlElement private Map parametersMap; // Getter and setter for parametersMap } 

如何使用JAXB注释实现这样的绑定?

提前致谢。

基本上你需要一个xml适配器。 您可以使用KeyValue类上的名称来获取所需的特定输出。

Parameter.java

 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.Map; @XmlRootElement(name = "data") @XmlAccessorType(XmlAccessType.FIELD) public class Parameters { @XmlJavaTypeAdapter(value = Adapter.class) private Map parametersMap; // Getter and setter for parametersMap } 

Adapter.java

 import javax.xml.bind.annotation.adapters.XmlAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; public class Adapter extends XmlAdapter, Map> { @Override public Map unmarshal(List v) throws Exception { Map map = new HashMap<>(v.size()); for (KeyValue keyValue : v) { map.put(keyValue.key, keyValue.value); } return map; } @Override public List marshal(Map v) throws Exception { Set keys = v.keySet(); List results = new ArrayList<>(v.size()); for (String key : keys) { results.add(new KeyValue(key, v.get(key))); } return results; } } 

KeyValue.java显然,在这里放置更好的JAXB标签。

 import javax.xml.bind.annotation.XmlType; @XmlType public class KeyValue { public KeyValue() { } public KeyValue(String key, String value) { this.key = key; this.value = value; } //obviously needs setters/getters String key; String value; }