gpt4 book ai didi

java - 针对泛型和特定类型或该类型列表的灵活 JAXB XML 解析

转载 作者:行者123 更新时间:2023-12-01 19:43:36 25 4
gpt4 key购买 nike

我正在使用同事的 API。 API 返回 Response包含一系列对象或仅一个单一对象。对象可以有多种类型。返回类型为 XML 格式。我有兴趣通过 JAXB 解析此 XML 以获取我的类,最好以灵活且通用的方式。

以下两个 XML 响应是我所讨论内容的示例。

示例 1:带有列表的响应 Jobs包含Job对象。

<Response>
<Status>OK</Status>
<Jobs>
<Job>
<ID>J1</ID>
<Name>job name</Name>
</Job>
<Job>
<ID>J2</ID>
<Name>job name</Name>
</Job>
</Jobs>
</Response>

示例 2:带有 Job 的响应.

<Response>
<Status>OK</Status>
<Job>
<ID>J123</ID>
<Name>job name</Name>
</Job>
</Response>

目前,我正在构建如下内容:

@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlElement(name = "Status")
protected Status status;
@XmlAnyElement(lax=true)
protected Object items;
}

解码通过

   Response = (Response) unmarshaller.unmarshal(myXmlResponse);

但我收到 null解码时在我的项目中 Sample 1 。另外,当我使用 Object 时,这种方法给我一种不好的感觉。作为一个包罗万象,即期待 List<Job>Job类型。我究竟做错了什么?有更好的解决方案吗?也许我的响应类可以有两个泛型,一个用于 item 列表s 和另一个为单个 item

一种方法,其中单数 <Job>转换为 job 的列表包含一个元素的 s 也会很有趣,但我不确定它是否可以成为一个通用的而不修改 XML 响应。

最佳答案

你可以这样做:

@XmlRootElement(name = "Response")
public class Response {

@XmlElement(name ="Status")
private Status status;

@XmlElements({
@XmlElement(name = "Job", type = Job.class),
@XmlElement(name = "Jobs", type = Jobs.class),
})
private List<?> jobs;
}

那么工作将是:

public class Job {

@XmlElement(name = "ID")
private String id;
@XmlElement(name = "Name")
private String name;
}

和工作:

public class Jobs {

@XmlElement(name = "Job")
private List<Job> jobs;
}

更新对评论的回答:

这是我能想到的处理这些描述的有效负载的最干净的方法。挑战在于<Jobs></Jobs>只在那里几次。

有一种方法可以在不嵌入列表的情况下做到这一点,但它更困惑。我将在下面复制它,以便您决定是否喜欢它,或者更好地获得另一个更干净的解决方案。

@XmlRootElement(name = "Response")
public class Response {

@XmlElement(name ="Status")
private Status status;

@XmlElement(name = "Job")
private List<Job> jobs;

@XmlElementWrapper(name = "Jobs")
@XmlElement(name = "Job")
private List<Job> jobsWrapped;

}

关于java - 针对泛型和特定类型或该类型列表的灵活 JAXB XML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54446220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com