ORVE WS (Dynamic) (4) Jackson XML mapper
0. Introduction
I love Jackson parser as it is easy to use and can be used to with some data formats such as CSV, JSON, YAML and XML. Just define a wrapper and a class for marshalling/unmarshalling.Although JAXB is a standard, in the Java ecosystem exists many solutions. And my decision is to use Jackson.
1. Defining MAVEN dependencies
To use Jackson XML it is required this dependency in Maven. Note that ${jackson.version} represents a variable that contains preferably the latest Jackson version.
1 2 3 4 5 | <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>${jackson.version}</version> </dependency> |
But if you want to use CSV, JSON or YAML in the project, it is as easy as including these dependencies
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!-- Jackson for CSV --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-csv</artifactId> <version>${jackson.version}</version> </dependency> <!-- Jackson for JSON --> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- Jackson for YAML --> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>${jackson.version}</version> </dependency> |
2. Marshalling/unmarshalling instances
The imports in the Java class are
1 2 | import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; |
And now the mapper can be defined
1 2 3 4 | XmlMapper mapper = new XmlMapper(); mapper.setDefaultUseWrapper(false); // No wrapper for List<> !!!!!!! mapper.registerModule(new JaxbAnnotationModule()); // Accept JAXB Annotations !!!! |
In line 2, this sentence tells the wrapper NOT TO USE A FIELD WRAPPER. I have wasted nearly 2 days trying to unmarshal a class that some of its attributes where collections.
3. Wrapped and unwrapped XML formats
Here is a simple class showing the different XML formats for wrapped and unwrapped. The wrapped format has a tag that surrounds the collection.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package ximodante.orve.dynamicp; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.dataformat.xml.XmlMapper; /** * Show the difference betweeen wrapped and unwrapped collections in XML * @author Ximo Dante * */ public class MyClass { public List<Integer> myIntList= new ArrayList<Integer>(); public static void main(String[] args) { MyClass c= new MyClass(); c.myIntList.add(1); c.myIntList.add(2); c.myIntList.add(3); XmlMapper wrapMapper = new XmlMapper(); wrapMapper.setDefaultUseWrapper(true); XmlMapper noWrapMapper = new XmlMapper(); noWrapMapper.setDefaultUseWrapper(false); // No wrapper for List<> !!!!!!! try { System.out.println("wrapped collection......"); System.out.println(wrapMapper.writeValueAsString(c)); System.out.println("\nunwrapped collection......"); System.out.println(noWrapMapper.writeValueAsString(c)); } catch (JsonProcessingException e) { e.printStackTrace(); } } } |
And the generated output is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | wrapped collection...... <MyClass> <myIntList> <myIntList>1</myIntList> <myIntList>2</myIntList> <myIntList>3</myIntList> </myIntList> </MyClass> unwrapped collection...... <MyClass> <myIntList>1</myIntList> <myIntList>2</myIntList> <myIntList>3</myIntList> </MyClass> |
4. Accept JAXB annotations
This sentence tells the Jackson XML mapper to accept the annotations.
mapper.registerModule(new JaxbAnnotationModule()); // Accept JAXB Annotations !!!!
Now we can marshall and unmarshal most of the classes.
Comments
Post a Comment