关于XML与Object的转换

作者吐槽公司更换支付渠道时与第三方对接字段名无文档、命名混乱的问题。随后进入正文,介绍了xml与object转换所需依赖、主要使用的toXML和fromXML方法,还提及可能用到的注解,并给出实例代码、测试代码与输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写这篇文章前先吐槽一下,公司突然想换支付渠道然而这个支付渠道一部分与银行对接还有一部分需要与第三方对接,银行对接就不吐槽了而跟第三方对接简直哔了狗,字段名没文档根本就看不懂各种英文首字母中文首字母缩写还不算,还他喵的同一个字段不同的接口取名不一样,-_-。

开始在正文

  1. 首先,xml与object转换需要的依赖:
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
</dependency>
<dependency>
    <groupId>xmlpull</groupId>
    <artifactId>xmlpull</artifactId>
    <version>1.1.3.1</version>
</dependency>
  1. 主要使用的方法:
    • toXML(Object obj)方法:该方法主要是将对象转换成xml格式的字符串。
    • fromXML(String xml)方法:该方法主要是将XML格式的字符串转换成Object对象。
  2. 可能使用到的注解:
@XStreamAlias("xml")									//作用于类或字段,取别名
@XStreamImplicit 										//隐式集合 
@XStreamImplicit(itemFieldName="part") 					//作用于集合字段 
@XStreamConverter(SingleValueCalendarConverter.class) 	//作用于对象,注入转换器
@XStreamAsAttribute 									//作用于字段,转换成属性 
@XStreamOmitField 										//作用于字段,忽略字段  
注意:如果使用以上注解,则需要使用autodetectAnnotations(true); 将XStream对象的自动侦查注解设置为true。或使用processAnnotations(clazz);【class为需要转换的对象类.calss】,否则注解将会无效。
  1. 实例代码:
	/**
     * 将xml字符串转换成object对象
     * @param xmlStr
     * @return
     * @author xu
     */
    public static Object xmlToObject(String xmlStr, Class clazz) {
        XStream xStream = new XStream();
        /**
         * 由于使用xStream.autodetectAnnotations(true);注解貌似无效,
         * 导致转换时出现异常,因此使用xStream.processAnnotations(clazz);
         * 来进行注解注入。
         */
        xStream.processAnnotations(clazz);
        return xStream.fromXML(xmlStr);
    }
    
	/**
     * 将Object对象转换成XML字符串
     * @param obj
     * @return
     * @author xu
     */
    public static String objectToXML(Object obj) {
        XStream xStream = new XStream();
        /**
         * 当不使用xStream.autodetectAnnotations(true);
         * 或xStream.processAnnotations(clazz);时,输出结果如下:
         * <com.test.Student>
         *   <sid>1</sid>
         *   <name>张三</name>
         *   <age>25</age>
         *   <sex>女</sex>
         * </com.test.Student>
         */
        xStream.autodetectAnnotations(true);
        return xStream.toXML(obj);
    }

	/**
	 * 转换的对象类
	 */
	@XStreamAlias("STUDENT")
	class Student {
	    /** id */
	    @XStreamAlias("SID")
	    private Long sid;
	
	    /** 学生姓名 */
	    @XStreamAlias("NAME")
	    private String name;
	
	    /** 学生年龄 */
	    @XStreamAlias("AGE")
	    private Integer age;
	
	    /** 学生性别 */
	    @XStreamAlias("SEX")
	    private String sex;
	
	    public Long getSid() {
	        return sid;
	    }
	
	    public void setSid(Long sid) {
	        this.sid = sid;
	    }
	
	    public String getName() {
	        return name;
	    }
	
	    public void setName(String name) {
	        this.name = name;
	    }
	
	    public Integer getAge() {
	        return age;
	    }
	
	    public void setAge(Integer age) {
	        this.age = age;
	    }
	
	    public String getSex() {
	        return sex;
	    }
	
	    public void setSex(String sex) {
	        this.sex = sex;
	    }
	
	    public Student() {
	    }
	
	    public Student(Long sid, String name, Integer age, String sex) {
	        this.sid = sid;
	        this.name = name;
	        this.age = age;
	        this.sex = sex;
	    }
	
	    @Override
	    public String toString() {
	        return "Student{" +
	                "sid=" + sid +
	                ", name='" + name + '\'' +
	                ", age=" + age +
	                ", sex='" + sex + '\'' +
	                '}';
	    }
	}

测试代码与输出:

	/**
     * 对象转XML测试方法
     */
    @Test
    public void objectToXMLTest() {
        Student student = new Student(1L, "张三", 25, "女");
        System.out.println(objectToXML(student));
    }
	//输出结果为:
	//<STUDENT>
  	//	<SID>1</SID>
  	//	<NAME>张三</NAME>
  	//	<AGE>25</AGE>
  	//	<SEX>女</SEX>
	//</STUDENT>

	/**
     * XML转对象测试方法
     */
    @Test
    public void xmlToObjectTest() {
        StringBuilder sb = new StringBuilder("<STUDENT>")
                .append("<SID>1</SID>")
                .append("<NAME>张三</NAME>")
                .append("<AGE>25</AGE>")
                .append("<SEX>女</SEX>")
                .append("</STUDENT>");
        Student stu = (Student)xmlToObject(sb.toString(), Student.class);
        System.out.println(stu.toString());
    }
	//输出结果为:
	//Student{sid=1, name='张三', age=25, sex='女'}

以上为个人总结的一些笔记,若有雷同纯属巧合,若有错误欢迎指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值