JAXB 怎么实现带泛型 XML 转 Bean。

2021-08-16 16:14:31 +08:00
 DavidDee
<?xml version="1.0" encoding="GB2312"?>
<DocumentElement>
  <Result>0</Result>
  <Error></Error>
  <DataTable>
      <a>/<a>
      <b>/<b>
  </DataTable>
  <DataTable>
      <a>/<a>
      <b>/<b>
  </DataTable>
</DocumentElement>
<!--------------------------或者-------------------------->
<?xml version="1.0" encoding="GB2312"?>
<DocumentElement>
  <Result>0</Result>
  <Error></Error>
  <DataTable>
      <c>/<c>
      <d>/<d>
  </DataTable>
  <DataTable>
      <c>/<c>
      <d>/<d>
  </DataTable>
</DocumentElement>
@XmlRootElement(name = "DocumentElement")
@XmlSeeAlso({X.class, Y.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseEntity <T> {

    @XmlElement(name = "Result")
    private String result;
    @XmlElement(name = "Error")
    private String error;
    @XmlAnyElement(lax = true)
    private List<T> dataTable;

    public ResponseEntity() {

    }

   // getter/setter 省略
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class X {
    private String a;
    private String b;
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Y {
    private String c;
    private String d;
}
        //获得 JAXBContext 类的新实例。参数为类的地址
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        //创建一个可以用来将 XML 数据转换为 java 内容树的 Unmarshaller 对象。
        Unmarshaller um = context.createUnmarshaller();
        //创建一个 StringReader 将 xml 报文转成流
        StringReader sr = new StringReader(xml);
        //调用 unmarshal 进行转换,并把 Object 类型强转为调用者的类型
        t = (T) um.unmarshal(sr);
        //将对象返回给调用者
        return t;

目前的问题

不知道各位有没有遇到过或提供一下解决思路。不胜感激

1320 次点击
所在节点    Java
5 条回复
DavidDee
2021-08-16 17:29:06 +08:00
算了,都用 DataTable 节点的话不行,我手动这个这点内容吧,然后再使用包装类用不同的 name 解析,不浪费时间了
cp19890714
2021-08-16 22:20:01 +08:00
这不是类型擦除导致的, 而是因为你就没有传入具体类型, 程序自然不知道你要反序列化为什么玩意.
jackson 在反序列化 json 时, 需要传入目标类型的 TypeReference, 其中需要指明泛型的具体类型. 如果没有指定, 同样不能反序列化.
jaxb 也是一样.

即使能实现, 那也是通过遍历,或者你指定的一些规则, 去猜测这个泛型可能的具体类型.
hdfg159
2021-08-17 08:01:49 +08:00
用数组
DavidDee
2021-08-17 10:52:30 +08:00
@cp19890714 感谢回复。其实在之前已经使用过包装类,将具体需要转换的类型放入泛型了,但是还是有问题。
8bit
2021-08-31 15:16:53 +08:00
用继承的方式解决,DataTable 作为父类,各子类使用自己类名作为 XML 节点名,在转换完之后将该节点名替换为 DataTable,这就解决了泛型未传入类型的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX