Java接收xml格式参数转为json的方法
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>
进行遍历了
到此这篇关于Java接收xml格式参数转为json的文章就介绍到这了,更多相关java xml转为json内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud Config使用本地仓库及map注入
这篇文章主要介绍了SpringCloud Config使用本地仓库及map注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-09-09SpringBoot RestTemplate 简单包装解析
这篇文章主要介绍了SpringBoot RestTemplate 简单包装解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-08-08
最新评论