java - 使用 JAXB 自定义 map 解码

标签 java xml jaxb

我有一个 XML,其中包含像这样序列化的 map :

<system>
  ...
  <entities>
    <entity>
      <string>key<string>
      <string><![CDATA[["a", "b", "c"]]]></string>
    </entity>
    ...
  </entities>
</system>

我想从中得到的是 <entities>反序列化为 Map<String, Object>map.get(key)返回字符串列表。

class System {
  ...
  private Map<String, Object> properties;
}

所以问题是如何让它与 JAXB 一起工作?

最佳答案

您必须使用 XmlAdapter 和 @XmlJavaTypeAdapter 注释。

第 1 步:创建一个代表您的 <entity> 的类实体元素并使用 JAXB 映射它。

第 2 步:创建一个扩展 XmlAdapter<List<Entity>,Map<String,Object> 的类并定义抽象方法 marshall 和 unmarshall。

第 3 步:创建一个类实体,如下所示:

@XmlRootElement
@XmlSeeAlso({Entity.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}

然后,当您解码文件时,您将拥有一个包含 map 的 Entities 对象。

如果您遇到问题,请告诉我这个解决方案是否适合您的需求,以便我可以编辑/附加我的答案。

EDIT :

如果您的实体元素不是根元素,那么您可以像这样映射它:

class ParentElement{

    //Other fields

    @XmlElement(name="entities")
    private Entities entities;

    //Getters, Setters, Methods
}

并保留实体类

@XmlSeeAlso({Entity.class})
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}

关于java - 使用 JAXB 自定义 map 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38053583/

相关文章:

java - <Spring Boot/Springfox> Swagger UI 未显示示例值和模型

java - 私有(private)方法的 Junit 测试用例

java - 如何在同一集群上的 HBase 中创建表的副本?或者,如何在工作状态下操作时使用原始状态服务请求

java - 如何在 servlet 上下文中从 jar 文件读取 xml 模式

php - 如何在 PHP 中使用 SimpleXMLElement 生成命名空间前缀的 xml 元素

java - 如何使用完整的本地 namespace 而不是前缀

java - XML 到 JAXB 的绑定(bind)是否具有嵌套元素?

java - Maven 未下载插件

xml - 需要 XSL 帮助

java - 使用 JAXB 将元素表示为 boolean 值?