JAXB java.util.Map绑定

发布于 2021-01-30 16:20:23

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

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

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

@XmlRootElement(name="data")
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameters {
    @XmlElement
    private Map<String,String> parametersMap;

    // Getter and setter for parametersMap
}

如何使用JAXB批注实现这种绑定?

提前致谢。

关注者
0
被浏览
92
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    基本上,您需要一个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<String, String> 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<List<KeyValue>, Map<String, String>> {
    
        @Override
        public Map<String, String> unmarshal(List<KeyValue> v) throws Exception {
            Map<String, String> map = new HashMap<>(v.size());
            for (KeyValue keyValue : v) {
                map.put(keyValue.key, keyValue.value);
            }
            return map;
        }
    
        @Override
        public List<KeyValue> marshal(Map<String, String> v) throws Exception {
            Set<String> keys = v.keySet();
            List<KeyValue> 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;
    }
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看