天天看點

java xml/bean轉換

jdk提供了JAXB來解析bean和xml之間的轉換

常用注解

@XmlTransient:不參與序列化(有該注解表示瞬态,沒有表示非瞬态)

@XmlAccessorType:控制字段或屬性是否序列化

  • XmlAccessorType.FIELD:類中的每個非靜态、非瞬态字段将自動綁定到XML
  • XmlAccessorType.NONE:沒有字段或屬性綁定到XML,除非使用特定的注解
  • XmlAccessorType.PROPERTY:類中的getter / setter對将被自動綁定到XML,除了瞬态的
  • XmlAccessorType.PUBLIC_MEMBER:預設的序列化。類中的公共getter / setter對和每個公共字段将被自動綁定到XML,除了瞬态的

@XmlAccessorOrder:控制類中字段和屬性的順序

  • XmlAccessOrder.ALPHABETICAL:排序按照String.compareTo方法确定的字母順序
  • XmlAccessOrder.UNDEFINED:預設的排序。按照類中字段的順序排序

@XmlType:将類或枚舉類型映射到XML模式類型

  • propOrder:自定義排序

@XmlRootElement:根目錄,預設為類名稱

@XmlAttribute:将類屬性映射到XML屬性,預設為字段名稱

@XmlElement:将類屬性映射到XML元素,預設為字段名稱。當序列化為XmlAccessorType.NONE或修改映射名稱時使用

@XmlElementRef:映射其他類屬性到XML元素

example:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
//@XmlType(propOrder = {"name", "id", "sex", "age"})
@XmlRootElement
public class User {
	@XmlAttribute
    private Long id;

    @XmlElement(name = "nickname")
    private String name;

    private Integer age;

    private Boolean sex;
    
	@XmlElementRef
	private Account account;
    //getter setter toString省略。。。
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
@XmlRootElement
public class Account {

    private String username;

    private String password;
    //getter setter toString省略。。。
}
           

bean轉xml

@Test
	public void bean2xml(){
		User user = new User();
        user.setId(1L);
        user.setName("xiaoming");
        user.setAge(18);
        user.setSex(true);
        Account account = new Account();
        account.setUsername("admin");
        account.setPassword("123456");
        user.setAccount(account);
        //擷取JAXBContext
        JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
        //建立一個可用于将java内容樹轉換為XML資料的Marshaller對象
        Marshaller marshaller = jaxbContext.createMarshaller();
        //指定編組的XML資料是否使用換行符和縮進格式化的屬性的名稱
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        //将解析的xml封裝到StringWriter中
        StringWriter writer = new StringWriter();
        marshaller.marshal(user, writer);
        System.out.println(writer.toString());
	}
           

結果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user id="1">
    <account>
        <password>123456</password>
        <username>admin</username>
    </account>
    <age>18</age>
    <nickname>xiaoming</nickname>
    <sex>true</sex>
</user>
           

xml轉bean

@Test
	public void xml2bean
		//bean轉換成xml的結果
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                "<user id=\"1\">\n" +
                "    <account>\n" +
                "        <password>123456</password>\n" +
                "        <username>admin</username>\n" +
                "    </account>\n" +
                "    <age>18</age>\n" +
                "    <nickname>xiaoming</nickname>\n" +
                "    <sex>true</sex>\n" +
                "</user>";
        //擷取JAXBContext
        JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
        //建立一個可以将XML資料轉換為java内容樹的 Unmarshaller對象
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        //解析StringReader中的xml
        StringReader reader = new StringReader(xml);
        Object unmarshal = unmarshaller.unmarshal(reader);
        System.out.println(unmarshal);
    }
           

結果:

User{id=1, name='xiaoming', age=18, sex=true, account=Account{username='admin', password='123456'}}
           

作者部落格

作者公衆号

java xml/bean轉換