java - 未调用 XmlAdapter 将 List 适配为 Map

标签 java xml jaxb

我正在使用 JAXB,所以我问的很多问题只是为了看看有什么可能。

我有以下 XML:

<bundleMappings>
    <mapping>
        <parameter attr = "value">asdas</parameter>
        <parameter attr = "value2">d123asdsad</parameter>
        <parameter attr = "value3">0</parameter>
    </mapping>
    <mapping>
        <parameter attr = "value">23123s</parameter>
        <parameter attr = "value2">qwerty</parameter>
        <!-- more parameter elements -->
    </mapping>
    <!-- more mapping elements -->
</bundleMappings>

其中我想要 parameter Map<String, Parameter> 中的元素而不是列表,其中键是 attr value,value 就是元素的内容。我关注了一些博客文章并提出了这个。

@XmlRootElement(name = "bundleMmappings")
public class BundleMappings { 
    @XmlElement(name = "mapping")
    private List<Mapping> mMappings;

    //getters setters
}

@XmlAccessorType(XmlAccessType.FIELD) 
public class Mapping {
    @XmlElement
    @XmlJavaTypeAdapter(ParameterAdapter.class)
    private HashMap<String, Parameter> mParameterMap;

    //getters setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {
    @XmlAttribute(name = "attr")
    private String mName;

    @XmlValue
    private String mValue;

    //getters setters
} 

@XmlAccessorType(XmlAccessType.FIELD)
public class Parameters {
    @XmlElement(name = "parameters")
    private List<Parameter> parameters = new LinkedList<>();

    //getters setters
}

和适配器:

public class ParameterAdapter extends XmlAdapter<Parameters, Map<String, Parameter>> {

    @Override
    public Parameters marshal(Map<String, Parameter> map) throws Exception {
        Parameters params = new Parameters();
        params.setParameters(new ArrayList<Parameter>());
        for (String name : map.keySet()) {
            Parameter p = new Parameter();
            p.setName(name);
            p.setValue(map.get(name).getValue());
            params.getParameters().add(p);
        }
        return params;
    }

    @Override
    public Map<String, Parameter> unmarshal(Parameters value) throws Exception {
        Map<String, Parameter> map = new HashMap<>();
        for (Parameter parameter : value.getParameters()) {
            map.put(parameter.getName(), parameter);
        }
        return map;
    }
}

我在适配器 unmarshal 中使用断点做了一个小型的解码测试。它根本没有被调用。为什么不呢?

我还尝试注释 MappingList@XmlElement(name = "parameter") 。在这种情况下 unmarshall被称为但 Parameters传递给它的参数有一个空列表。

编辑

如果我尝试编码:

<bundleMappings>
    <mapping>
        <mParameterMap>
            <parameter name="HOME_NETWORK_ID">12345</parameter>
        </mParameterMap>
    </mapping>
</bundleMappings>

最佳答案

当您在集合属性上指定 XmlAdapter 时,它将应用于集合中的项目。

public class Mapping {
    @XmlElement
    @XmlJavaTypeAdapter(ParameterAdapter.class)
    private List<Parameter> mParameters;

    //getters setters
}

这意味着 ParameterAdapter 需要看起来像这样,其中 Foo 是将 Parameter 转换为:

public class ParameterAdapter extends XmlAdapter<Foo, Parameter> {

map 示例

下面是我博客中的示例链接,其中 XmlAdapter 用于 Map 属性:

关于java - 未调用 XmlAdapter 将 List 适配为 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204167/

相关文章:

java - 在 Blackberry 中上传 UTF-8 文本文件

java - 将字符串值从没有构建器的 Activity 发送到正常 Activity

java - 使用自动生成的名称将 java 对象序列化为 json

java - java中如何以大写和小写字母存储同名文件

java - JAXB 异常消息 : How to change language?

java - 使用 JAXB(或其他)从 maven 中的 XSD maven 依赖项生成 Java 类

java - 在运行时加载驱动程序 jar 文件导致 Perm Gen Space Error

xml - 使用 xslt 删除 xml 中的重复项

python - 在 Python XML 解析中保留转义字符

java - 使用函数隐藏所有相对布局,我们选择的除外