簡體   English   中英

Xml 序列化 JAXB 與 Jackson-dataformat-xml?

[英]Xml serialization JAXB vs Jackson-dataformat-xml?

我有一個 XSD,我想從中支持 JSON 和 XML 數據格式序列化/反序列化。

我使用xjc實用程序生成了我的模型類。

所以直到現在我已經使用 Jackson JSON 庫處理了 JSON 數據。

我不能修改我的Java類,所以我配置ObjectMapperMix-In annotations和其他功能,如PropertyNamingStrategy (改變字段名), SerializationFeature.WRAP_ROOT_VALUE通過代碼提供了我的serilaization配置。

現在我想對 XML 序列化過程做同樣的事情。

我已在線閱讀各種選項:

  1. JAXB
  2. Jackson 庫 + Jackson-dataformat-xml.jar
  3. 流媒體

哪個最適合我的情況(不能用注釋編輯我的 POJO,只允許代碼配置)??

我投票給答案#2:使用Jackson-dataformat-xml。 我們處於類似的情況,發現通過Jackson序列化為XML比預期更容易。 這是因為XmlMapper擴展了ObjectMapper因此我們所有的配置更改(混合,使用JavaTimeModule等)都可以直接應用於XmlMapper ,它們只是起作用。

您已經將Jackson配置為根據需要輸出數據,因此難以完成。 我建議利用你已經投入的努力並使用Jackson-dataformat-xml。

我的投票是#2傑克遜庫+ Jackson-dataformat-xml.jar看看JSON和XML的代碼,這里和那里的位變化是一樣的。

 ****MainClass****

  import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
  import com.fasterxml.jackson.annotation.PropertyAccessor;
  import com.fasterxml.jackson.core.JsonProcessingException;
  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.fasterxml.jackson.databind.SerializationFeature;
  import com.fasterxml.jackson.dataformat.xml.XmlMapper;

 public class MainClass {

public static void main(String[] args) throws JsonProcessingException {

    // Serialization: java obj to json--> writeValueAsString
    // DeSerialization: json to java obj--> ReadValue

    XmlMapper mapper1 = new XmlMapper();
    ObjectMapper mapper2 = new ObjectMapper();

    mapper1.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
    mapper2.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

    mapper1.enable(SerializationFeature.INDENT_OUTPUT);
    mapper2.enable(SerializationFeature.INDENT_OUTPUT);

    MyPojo mypojo = new MyPojo();
    mypojo.setName("Dhani");
    mypojo.setId("18082013");
    mypojo.setAge(5);

    String jsonStringXML = mapper1.writeValueAsString(mypojo);
    String jsonStringJSON = mapper2.writeValueAsString(mypojo);
    // takes java class with def or customized constructors and creates JSON

    System.out.println("XML is " + "\n" + jsonStringXML + "\n");
    System.out.println("Json is " + "\n" + jsonStringJSON);
}   }

*****MyPojo.java*****

   import com.fasterxml.jackson.annotation.JsonIgnore;
   import com.fasterxml.jackson.annotation.JsonProperty;
   import com.fasterxml.jackson.annotation.JsonPropertyOrder;
   import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

  @JsonPropertyOrder({ "name", "age", "id", "note" })
  @JacksonXmlRootElement(namespace = "urn:stackify:jacksonxml", localName = "myPOJO")
   public class MyPojo {

@JsonProperty("_id")
private String id;

private String name;

private int age;

@JsonIgnore
private String note;

public String getNote() {
    return note;
}

public void setNote(String note) {
    this.note = note;
}

public String getId() {
    return id;
}

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

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;
} }


 ***RESULT****
 XML is 
        <myPOJO xmlns="urn:stackify:jacksonxml">
        <name xmlns="">Dhani</name>
         <age xmlns="">5</age>
         <_id xmlns="">18082013</_id>
         </myPOJO>


   Json is 
     {
      "name" : "Dhani",
       "age" : 5,
       "_id" : "18082013"
         }

我為我的 XML 序列化/反序列化選擇了 JAXB,因為我已經有了一個 XML 模式,並且想要 XML 以 JAXB 提供的本地 XML 庫的方式提供。 即使 Jackson xml 滿足您的需求也是一個不錯的選擇。

Jackson XML 模塊的局限性:

Jackson 中的 XML 模塊絕不是為了完全替代 JAXB 而設計的。 某些構造在 JAXB 和 Jackson 之間的工作方式略有不同,並且不能保證 Jackson 會生成與 JAXB 相同的 XML。

請注意,與 JSON 不同,最外層對象必須是 bean 類型——它不能是原始類型或包裝類型、枚舉或集合。 這是 XML 工作方式的直接結果——XML 無法表示這樣的頂級值。

默認情況下,Jackson 將始終為集合使用包裝元素,這也與 JAXB 的工作方式不同。 這是 Jackson 生成的 XML 與 JAXB 生成的 XML 不兼容的主要方式。 當然,可以配置行為,使用一個字段的 JacksonXmlElementWrapper 注釋或全局 XmlMapper 上的 setDefaultUseWrapper 配置設置。

Jackson 也不支持使用特定的 XML 模式。 它旨在首先編寫 Java Bean,而不是從預先存在的模式生成 Java 代碼。 請注意,這可以通過使用 JAXB 注釋支持並使用標准 xjc 工具生成 bean 來在一定程度上解決。

同樣,它不支持一些更高級的 XML 工具——例如 XPath 或 XSLT。 如果我們需要這種級別的支持,那么我們應該改用功能更全面的 XML 解決方案。

概括:

如果您正在尋找一種成熟、靈活的方式來支持和使用 JSON 和 XML 來處理相同的數據,那么 Jackson XML 模塊是一個非常棒的可以利用的庫。 它不僅是獨立運行的可靠方式,而且還有一個額外的好處,即能夠為 XML 和 JSON 重用相同的配置。

通常,這必須使用兩個具有完全獨立配置的不同庫來處理。

最后,除了靈活性和易用性之外,傑克遜團隊歷來非常重視性能。 鑒於數據的編組和解組是大多數 Web 應用程序的重要組成部分,因此選擇合適的庫來處理所有這些工作至關重要。 再加上諸如 Retrace 之類的性能監控工具,您可以充分利用您的應用程序。

參考資料: https : //stackify.com/java-xml-jackson/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM