当前位置: 首页 > article >正文

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>进行遍历了


http://www.kler.cn/a/390797.html

相关文章:

  • 网站小程序app怎么查有没有备案?
  • vue中如何关闭eslint检测?
  • 【前端】Vue中如何避免出现内存泄漏
  • 01-Ajax入门与axios使用、URL知识
  • 前端知识点---Javascript的对象(Javascript)
  • 【MySQL从入门到放弃】InnoDB磁盘结构(一)
  • sql注入基础知识
  • 海柔仿真系统存储实践:混合云架构下实现高可用与极简运维
  • 【cft.show-web3解题思路】-php://input伪协议
  • 行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题
  • Python 正则表达式使用指南
  • Vue页面假死点不动现象Cannot read properties of undefined(reading ‘_wrapper‘)报错
  • 如何在Linux中使用Cron定时执行SQL任务
  • ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析
  • 机器学习(基础2)
  • HCIP-快速生成树RSTP
  • redis:zset有序集合命令和内部编码
  • 漏洞扫描工具和漏洞利用工具
  • C++ 11新特性:列表初始化,右值引用与移动语义
  • 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
  • 【JavaEE】JUC的常见类
  • Android 开发指南:初学者入门
  • 如何比较科学的设置代理ip
  • react 类组件和函数组件区别
  • 【系统架构设计师】真题论文: 论数据挖掘技术的应用(包括解题思路和素材)
  • 一些npm总结(持续更新...)