java对象与xml相互转换 ---- xstream

时间:2020-11-27 19:05:18

XStream是一个Java对象和XML相互转换的工具,很好很强大。提供了所有的基础类型、数组、集合等类型直接转换的支持。

XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用了。

 

由于XStream.jar依赖于xmlpull.jar 所以,需将这两个jar一同导入。

下载地址 : https://pan.baidu.com/s/1eSpZs3o#path=%252F%25E5%25B7%25A5%25E5%2585%25B7jar

 

XStream对象相当Java对象和XML之间的转换器,转换过程是双向的。创建XSteam对象的方式很简单,只需要new XStream()即可。
Java到xml,用 toXML()方法。
Xml到Java,用 fromXML()方法。
 
别名配置包含三种情况:
1、类别名,用 alias(String name, Class type)
2、类成员别名,用 aliasField(String alias, Class definedIn, String fieldName)
3、类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias),单独命名没有意义,还要通过 useAttributeFor(Class definedIn, String fieldName) 应用到某个类上。
别名的配置是非常重要的,但是其中有些细节问题很重要。
 
简单举例如下 :
 
普通java对象 :
package com.test;

public class Freind {

    private String name;
    
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Freind [name=" + name + ", age=" + age + "]";
    }
    
    
}

 

package com.test;

import java.util.List;

public class Person {

    private int id;
    
    private String name;
    
    private List<Freind> fav;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Freind> getFav() {
        return fav;
    }

    public void setFav(List<Freind> fav) {
        this.fav = fav;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", fav=" + fav + "]";
    }
    
    
}

 

 

测试类 :

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.test.Freind;
import com.test.Person;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;



public class XstreamTest {

    public static void main(String[] args) throws IOException {
        XStream stream = new XStream(new DomDriver());
        Person pr = new Person();
        
        pr.setId(1);
        pr.setName("张三");
        List<Freind> favs = new ArrayList<Freind>();
        for(int i = 18; i < 20; i++) {
            Freind fd = new Freind();
            fd.setAge(i);
            fd.setName("混混" + i);
            favs.add(fd);
        }
        pr.setFav(favs);
        
        System.out.println("-------------起别名前-----------------");
        System.out.println(stream.toXML(pr));
        System.out.println("-------------起别名后-----------------");
        //类起别名
        stream.alias("person", pr.getClass());
        stream.alias("freind", Freind.class);
        
        System.out.println(stream.toXML(pr));
        
        System.out.println("--------friend字段当属性处理---------");
        //字段“name”当属性处理
        stream.useAttributeFor(Freind.class, "name");
        System.out.println(stream.toXML(pr));
        
        System.out.println("-------------xml转java对象-----------------");
        
        Person result = (Person) stream.fromXML(stream.toXML(pr));
        System.out.println(result.toString());
    }
}

 

 

输出结果 :

-------------起别名前-----------------
<com.test.Person>
  <id>1</id>
  <name>张三</name>
  <fav>
    <com.test.Freind>
      <name>混混18</name>
      <age>18</age>
    </com.test.Freind>
    <com.test.Freind>
      <name>混混19</name>
      <age>19</age>
    </com.test.Freind>
  </fav>
</com.test.Person>
-------------起别名后-----------------
<person>
  <id>1</id>
  <name>张三</name>
  <fav>
    <freind>
      <name>混混18</name>
      <age>18</age>
    </freind>
    <freind>
      <name>混混19</name>
      <age>19</age>
    </freind>
  </fav>
</person>
--------friend字段当属性处理---------
<person>
  <id>1</id>
  <name>张三</name>
  <fav>
    <freind name="混混18">
      <age>18</age>
    </freind>
    <freind name="混混19">
      <age>19</age>
    </freind>
  </fav>
</person>
-------------xml转java对象-----------------
Person [id=1, name=张三, fav=[Freind [name=混混18, age=18], Freind [name=混混19, age=19]]]