
<?xml version="1.0" encoding=""?> <DocumentElement> <Result>0</Result> lt;Error></Error> <DataTable> <a>/<a> <b>/<b> </DataTable> <DataTable> <a>/<a> <b>/<b> </DataTable> </DocumentElement> <!--------------------------或者--------------------------> <?xml version="1.0" encoding=""?> <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; 1 DavidDee OP 算了,都用 DataTable 节点的话不行,我手动这个这点内容吧,然后再使用包装类用不同的 name 解析,不浪费时间了 |
2 cp19890714 2021 年 8 月 16 日 这不是类型擦除导致的, 而是因为你就没有传入具体类型, 程序自然不知道你要反序列化为什么玩意. jackson 在反序列化 json 时, 需要传入目标类型的 TypeReference, 其中需要指明泛型的具体类型. 如果没有指定, 同样不能反序列化. jaxb 也是一样. 即使能实现, 那也是通过遍历,或者你指定的一些规则, 去猜测这个泛型可能的具体类型. |
3 hdfg159 2021 年 8 月 17 日 via Android 用数组 |
4 DavidDee OP @cp19890714 感谢回复。其实在之前已经使用过包装类,将具体需要转换的类型放入泛型了,但是还是有问题。 |
5 8bit 2021 年 8 月 31 日 用继承的方式解决,DataTable 作为父类,各子类使用自己类名作为 XML 节点名,在转换完之后将该节点名替换为 DataTable,这就解决了泛型未传入类型的问题 |