Search code examples
jsonxmljaxbjacksonjackson-dataformat-xml

Xml serialization JAXB vs Jackson-dataformat-xml?


I have a XSD from which I want to support both JSON and XML data formats serialization/deserialization.

I generated my Model classes using xjc utility.

So uptill now I have handled JSON data by using Jackson JSON library.

I cannot modify my Java classes, so I configured ObjectMapper with Mix-In annotations and other features like PropertyNamingStrategy (changing field names), SerializationFeature.WRAP_ROOT_VALUE to provide configurations over my serilaization through code.

Now I want to do the same with XML serialization process.

I have read online for various options :

  1. JAXB
  2. Jackson library + Jackson-dataformat-xml.jar
  3. XStream

Which is the most suitable for my case (cannot edit my POJOs with annotations, only code configurations allowed) ??


Solution

  • My vote is for #2 Jackson library + Jackson-dataformat-xml.jar Have a look on the code for JSON and XML, it's just the same with bit change here and there.

    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

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

    Json

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