Java接收xml格式参数转为json

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

1、界说实体类
  1. import javax.xml.bind.annotation.XmlElement;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement(name = "User")
  4. @Setter
  5. @ToString
  6. public class User {
  7.     private String name;
  8.    
  9.     @XmlElement(name = "username")
  10.     public String getName() {
  11.         return name;
  12.     }
  13. }
复制代码
留意这里需要把@XmlElement注解用在get方法上,实际使用时发现如果直接作用在字段上会报错。
2、使用jaxb对接 转为实体类
  1. import javax.xml.bind.JAXBContext;
  2. import javax.xml.bind.Unmarshaller;
  3. import java.io.StringReader;
  4. public User fromXml(String xmlData) throws Exception {
  5.     JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
  6.     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  7.     return (User) unmarshaller.unmarshal(new StringReader(xmlData));
  8. }
复制代码
这里的xmlData示例:<User><username>yogima<username></User>
就可以转换到实体类对应的字段中了
3、转为json
  1. import com.fasterxml.jackson.databind.ObjectMapper;
  2. public String toJson(User user) throws Exception {
  3.     ObjectMapper objectMapper = new ObjectMapper();
  4.     return objectMapper.writeValueAsString(user);
  5. }
复制代码
实际上返回给前端的时候也不需要自己手动去writeValueAsString,这里只是做个示例。
上述转为json后字段名使用的还是name,如果需要保持字段名为"username",只需要加上@JsonProperty。
  1. import javax.xml.bind.annotation.XmlElement;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. import com.fasterxml.jackson.annotation.JsonProperty;
  4. @XmlRootElement(name = "User")
  5. @Setter
  6. @ToString
  7. public class User {
  8.         @JsonProperty("username")
  9.     private String name;
  10.    
  11.     @XmlElement(name = "username")
  12.     public String getName() {
  13.         return name;
  14.     }
  15. }
复制代码
如许看注解有时候还挺多此一举的,直接User类中的字段用username就可以不需要注解;但是比如说返回的字段是<ABC_AA>12345</ABC_AA><AAA>111</AAA>,如果我不去规定@JsonProperty和@XmlElement,直接把字段界说成大写的ABC_AA和AAA,也可以接收到xml参数,但是不符合Java定名规范,而且会发现AAA默认转出来的json字段叫做aaa,而ABC_AA转出来则是abc_AA.以是我们还是加上注释会更优雅一些。
  1. @JsonProperty("ABC_AA")
  2. private String abcAa;
  3. @XmlElement(name = "ABC_AA")
  4. public String getAbcAa() {
  5.     return abcAa;
  6. }
复制代码
4、返回的xml较为复杂,需要提取
  1. import javax.xml.bind.JAXBContext;
  2. import javax.xml.bind.Unmarshaller;
  3. public class XmlConvertTest {
  4.     public static void main(String[] args) throws Exception{
  5.     //模拟较为复杂的xml数据
  6.     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>";
  7.     //使用正则取出需要的数据内容 即<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>
  8.     String cdataContent = xmlData.replaceAll("(?s).*?<result><!\\[CDATA\\[(.*?)]]></result>.*", "$1");
  9.     // 如果需要提取head部分 即<response_id>AA</response_id><status_code>200</status_code>
  10.     // String headContent = xmlData.replaceAll("(?s).*?<head>(.*?)</head>.*", "$1");
  11.     //裹上rows
  12.     String wrappedContent = "<rows>" + cdataContent + "</rows>";
  13.     JAXBContext jaxbContext = JAXBContext.newInstance(XmlTestDTO.class);
  14.     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  15.     XmlTestDTO dto = (XmlTestDTO) unmarshaller.unmarshal(new StringReader(wrappedContent));
  16.     System.out.println(dto);
  17. }
复制代码
对应的XmlTestDTO:
  1. @XmlRootElement(name = "rows")
  2. @Setter
  3. @ToString
  4. public class XmlTestDTO {
  5.         private List<XmlRowTest> rows = new ArrayList<>();
  6.     @XmlElement(name = "row") // 对应每个 <row> 元素
  7.     public List<XmlRowTest> getRows() {
  8.         return rows;
  9.     }
  10.    
  11.     //XmlRowTest不需要作为根元素的话,这里可以不用@XmlRootElement注解
  12.     //@XmlRootElement(name = "row")
  13.         @Setter
  14.         @ToString
  15.     public static class XmlRowTest{
  16.         @JsonProperty("AAA")
  17.         private String aaa;
  18.    
  19.         @XmlElement(name = "AAA")
  20.         public String getAaa() {
  21.             return aaa;
  22.         }
  23.     }
  24. }
复制代码
拿到XmlTestDTO dto后只要使用dto.getRows()就能对List<XmlRowTest>进行遍历了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表