1、界说实体类
- import javax.xml.bind.annotation.XmlElement;
- import javax.xml.bind.annotation.XmlRootElement;
- @XmlRootElement(name = "User")
- @Setter
- @ToString
- public class User {
- private String name;
-
- @XmlElement(name = "username")
- public String getName() {
- return name;
- }
- }
复制代码 留意这里需要把@XmlElement注解用在get方法上,实际使用时发现如果直接作用在字段上会报错。
2、使用jaxb对接 转为实体类
- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.Unmarshaller;
- import java.io.StringReader;
- public User fromXml(String xmlData) throws Exception {
- JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- return (User) unmarshaller.unmarshal(new StringReader(xmlData));
- }
复制代码 这里的xmlData示例:<User><username>yogima<username></User>
就可以转换到实体类对应的字段中了
3、转为json
- import com.fasterxml.jackson.databind.ObjectMapper;
- public String toJson(User user) throws Exception {
- ObjectMapper objectMapper = new ObjectMapper();
- return objectMapper.writeValueAsString(user);
- }
复制代码 实际上返回给前端的时候也不需要自己手动去writeValueAsString,这里只是做个示例。
上述转为json后字段名使用的还是name,如果需要保持字段名为"username",只需要加上@JsonProperty。
- import javax.xml.bind.annotation.XmlElement;
- import javax.xml.bind.annotation.XmlRootElement;
- import com.fasterxml.jackson.annotation.JsonProperty;
- @XmlRootElement(name = "User")
- @Setter
- @ToString
- public class User {
- @JsonProperty("username")
- private String name;
-
- @XmlElement(name = "username")
- public String getName() {
- return name;
- }
- }
复制代码 如许看注解有时候还挺多此一举的,直接User类中的字段用username就可以不需要注解;但是比如说返回的字段是<ABC_AA>12345</ABC_AA><AAA>111</AAA>,如果我不去规定@JsonProperty和@XmlElement,直接把字段界说成大写的ABC_AA和AAA,也可以接收到xml参数,但是不符合Java定名规范,而且会发现AAA默认转出来的json字段叫做aaa,而ABC_AA转出来则是abc_AA.以是我们还是加上注释会更优雅一些。
- @JsonProperty("ABC_AA")
- private String abcAa;
- @XmlElement(name = "ABC_AA")
- public String getAbcAa() {
- return abcAa;
- }
复制代码 4、返回的xml较为复杂,需要提取
- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.Unmarshaller;
- public class XmlConvertTest {
- public static void main(String[] args) throws Exception{
- //模拟较为复杂的xml数据
- String xmlData = "<response><head><response_id>AA</response_id><status_code>200</status_code></head><result><![CDATA[<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>]]></result></response>";
- //使用正则取出需要的数据内容 即<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>
- String cdataContent = xmlData.replaceAll("(?s).*?<result><!\\[CDATA\\[(.*?)]]></result>.*", "$1");
- // 如果需要提取head部分 即<response_id>AA</response_id><status_code>200</status_code>
- // String headContent = xmlData.replaceAll("(?s).*?<head>(.*?)</head>.*", "$1");
- //裹上rows
- String wrappedContent = "<rows>" + cdataContent + "</rows>";
- JAXBContext jaxbContext = JAXBContext.newInstance(XmlTestDTO.class);
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- XmlTestDTO dto = (XmlTestDTO) unmarshaller.unmarshal(new StringReader(wrappedContent));
- System.out.println(dto);
- }
复制代码 对应的XmlTestDTO:
- @XmlRootElement(name = "rows")
- @Setter
- @ToString
- public class XmlTestDTO {
- private List<XmlRowTest> rows = new ArrayList<>();
- @XmlElement(name = "row") // 对应每个 <row> 元素
- public List<XmlRowTest> getRows() {
- return rows;
- }
-
- //XmlRowTest不需要作为根元素的话,这里可以不用@XmlRootElement注解
- //@XmlRootElement(name = "row")
- @Setter
- @ToString
- public static class XmlRowTest{
- @JsonProperty("AAA")
- private String aaa;
-
- @XmlElement(name = "AAA")
- public String getAaa() {
- return aaa;
- }
- }
- }
复制代码 拿到XmlTestDTO dto后只要使用dto.getRows()就能对List<XmlRowTest>进行遍历了
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |