1. 程式人生 > >JAXB實現xml與bean之間的轉換

JAXB實現xml與bean之間的轉換

public class JAXBUtils {
    public static String convertToXml(Object obj, boolean format) throws Exception {
        try {
            StringWriter sw = new StringWriter();
            Marshaller marshaller = MarshallerFactory.getMarshaller(obj.getClass());
            if (marshaller == null) {
                return StringUtils.EMPTY;
            }

            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, format);
            marshaller.marshal(obj, sw);
            return sw.toString();
        } catch (JAXBException e) {
            throw new RuntimeException("obj toXML failed", e);
        }
    }

    public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
        try {
            Unmarshaller unmarshaller = MarshallerFactory.getUnmarshaller(t);
            if (unmarshaller == null) {
                return null;
            }

            StringReader sr = new StringReader(xml);
            T ret = null;
            ret = (T) unmarshaller.unmarshal(sr);
            return ret;
        } catch (JAXBException e) {
            throw new RuntimeException("xml toObj failed", e);
        }
    }
}
public class MarshallerFactory {

    private final static HashMap<Class, JAXBContext> JAXB_CONTEXT_MAP = Maps.newHashMap();

    private MarshallerFactory() {
    }

    static {
        try {
            JAXB_CONTEXT_MAP.put(RequestBean.class, JAXBContext.newInstance(RequestBean.class));
            // 想要進行的bean轉換的類,可以寫在這裡,初始化到Map中
        } catch (Exception e) {
            // 列印日誌
        }
    }

    public static Marshaller getMarshaller(Class t) throws JAXBException {
        Preconditions.checkNotNull(t);
        JAXBContext jaxbContext = JAXB_CONTEXT_MAP.get(t);
        if(jaxbContext == null) {
            return null;
        }

        return jaxbContext.createMarshaller();
    }

    public  static Unmarshaller getUnmarshaller(Class t) throws JAXBException {
        Preconditions.checkNotNull(t);
        JAXBContext jaxbContext = JAXB_CONTEXT_MAP.get(t);
        if(jaxbContext == null) {
            return null;
        }

        return jaxbContext.createUnmarshaller();
    }
}

主要就是三個介面,Marshaller、UnMarchaller和JAXBContext

  • JAXBContext類,是應用的入口,通過該類建立序列化和反序列化物件,也即編組物件和解組物件;
  • Marshaller 編組介面,將Java物件序列化為XML資料;
  • Unmarshaller 解組介面,將XML資料反序列化為Java物件。

為了便於支援多個bean的轉換,可以將需要轉換的類都放進Factory的靜態Map中,需要用的時候直接拿出來就行了。

至於如何寫bean,一種方法是手寫,建議參考這篇部落格https://www.cnblogs.com/chenbenbuyi/p/8283657.html

主要是弄懂各個標籤的含義和作用。

另外一種方法是通過xsd檔案(相當於xml的格式模板),使用IDEA的JAXB工具反向生成Java bean


相關推薦

JAXB實現xmlbean之間轉換

public class JAXBUtils { public static String convertToXml(Object obj, boolean format) throws Exception { try { St

利用JAXB實現xmlbean之間轉換(一)

JAXB能夠使用Jackson對JAXB註解的支援實現(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,這樣一來可以更好的標誌可以轉換為JSON物件的JAVA類。 JDK中JAXB相關的重要Class和Interfac

jaxb實現xmlbean的相互轉化

jaxb使用說明   這裡邊有提到MessageFormat,可以瞭解下。下邊還有一個其他部落格粘過來的幾行程式碼,記錄一下。  這裡以《書》為例,寫一個完整的測試程式碼,xml包含了各種元素和集合。  test.xml <?xml version="1.0" enco

JAXB實現xml物件互相轉換

不需要引入任何外部jar包,JAXB自jdk1.5就已被整合,jdk1.7已升級為JAXB2。 1.xml報文 <?xml version="1.0" encoding="UTF-8"?> <root xmlns="urn:iso:std:iso:20022:tec

jaxb實現xml 和 json 之間轉換

jaxb2 實體類轉xml: public static String toXML(Object obj, String encode, boolean format, boolean fragm

jaxb實現XMLJavaBean的互相轉換遇到的難點(一)

1.首先交代一下背景: 入職後項目組交給我的第一個任務便是做一個酒店直連對接,流程說白了就是發xml報文去攜程的系統,攜程返回xml裡面包含了酒店相關資訊,流程聽著很簡單,但是涉及到跟攜程對接、跟公司內部系統對接,作為一箇中間層,專案進度很難自己把控,再加上酒

利用Digester實現xmlbean之間轉換(二)

Digester框架屬於Jakarta Commons,它以規則和模式為基礎處理XML文件。與SAX和DOM之類的標準API相比,Digester不涉及太多的細節問題,非常適合於對XML文件進行簡單的處理。 比如要解析如下的xml檔案 <pers

JAVA 實現XMLJSON 相互轉換

tst throws light getc con parent urn In 工作 原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,經常碰到XML轉為JSON或者JSON轉為XML,在這

Java實現xmljson互相轉換

看到別人發的,感覺不錯,待驗證1.第一種方法(個人實現的)使用JSON-JAVA提供的方法,之前一直使用json-lib提供的方法轉json,後來發現了這個開源專案,覺得用起來很不錯,並且可以修改XML.java中的parse方法滿足自己的轉換需要。(1)首先去git下載所需

使用jaxb 實現物件xml之間轉換,並且是 soap報文物件轉換

使用jaxb 實現物件與xml之間的轉換,並且是 soap報文與物件轉換 1.測試用例 public class TestJaxb { @Test public void testToObject(){ JaxbBinder jaxbBinder = new Jax

C#實現Streambyte[]之間轉換實例教程

inpu more family get this splay 登錄 line mem 本文以實例形式詳細介紹了C#實現Stream與byte[]之間的轉換的方法,分享給大家供大家參考之用。具體方法如下: 一、二進制轉換成圖片 MemoryStream ms = new

使用XStream是實現XMLJava對象的轉換(2)--別名

name have ret lis sea sil 數組 ttr auth 五、使用別名(Alias) 首先,有這樣一段Java代碼: Java代碼 import java.util.ArrayList; import java.util.List;

使用XStream是實現XMLJava對象的轉換(6)--持久化

light 自己的 map stc title 指定 reg 對象 框架 九、持久化 在第八節的示例中,當我們操作一組對象時,我們可以指定Writer、OutputStream來寫出序列化後的XML數據,我們還可以指定Reader、InputStream來讀取序列化後的XM

使用XStream是實現XMLJava對象的轉換(5)--Object Stream

控制 () oid dex 關閉 ava -o setname otf 八,Object Stream 之前的例子我們都是直接輸出Xml成為String類型或者從String中獲得並解析Xml,現在我們要處理輸入流和輸出流! 1,輸出流(ObjectOutputStrea

java常用工具類(一)—— Map Bean 之間的互相轉換

import net.bytebuddy.implementation.bytecode.Throw; import org.springframework.cglib.beans.BeanMap; import java.beans.PropertyDescriptor; import java.lang

XML配置裡的Bean自動裝配Bean之間的關係

需要在<bean>的autowire屬性裡指定自動裝配的模式 byType(根據型別自動裝配)    byName(根據名稱自動裝配) constructor(通過構造器自動裝配)   名字須與屬性名一致    byName根據Bean

XML配置裏的Bean自動裝配Bean之間的關系

depend alt -o 裏的 關聯 ren 分享 -- xml配置 需要在<bean>的autowire屬性裏指定自動裝配的模式 byType(根據類型自動裝配) byName(根據名稱自動裝配) constructor(通過構造器自動裝配) 名字

json bean 之間的date轉換

擴充套件JsonValueProcessor介面獲得相應轉換的日期格式 import java.text.SimpleDateFormat;   import java.util.Date;     import net.sf.json.JsonConfig;   imp

基於Jackson的JsonUtil實現字串物件之間轉換

比較好用的工具類,要匯入Jackson-mapper-asl依賴。詳細看程式碼,其中DateTimeUtil是另外的工具類。 import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.

xmlbean間相互轉換(補充)

今天x被stream對xmlnode的屬性(attribute)解析的問題一直困擾著,查詢了很久都告知我要手寫一個Converter,那豈不意味著我每解析一個xml檔案,就得寫一次Converter,那樣太腦殘了,最後搜尋到其實可以用註解解決這個問題 XStream常用註解