java - JAXB java.util.Map 绑定(bind)

标签 java jaxb jaxb2

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

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

我不知道参数的名称和数量。因此,我需要并希望将所有这些参数绑定(bind)到一个由 <"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 注释实现这种绑定(bind)?

提前致谢。

最佳答案

基本上您需要一个 xml 适配器。您可以修改 KeyValue 类的名称以获得您想要的特定输出。

参数.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
}

适配器.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;
}

关于java - JAXB java.util.Map 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9478222/

相关文章:

Java,需要一个while循环才能达到eof。即 while !eof,继续解析

java - 对象变量的变量类型是什么?

java - JAXB 序列化 POJO 中的 JsonElement 字段

java - JAXB 2.0 XSD choiceContentProperty 错误行为

java - 命名空间之间的 jaxB 冲突

java - 重定向输出以作为命令行的输入?

java - 如何创建字符串的所有元音组合并将每个组合添加到 ArrayList

java - JAXB 2.1 为生成的类实现 Comparable<T>

java - 抽象类中的 XmlRootElement 注释 - 可能吗?

xml - JAXB:如何围绕 XmlRootElement 添加包装器?