How to convert a complex object into JSON using Jackson?
Now i am adding two more properties to the UserDO object. One is an ArrayList and another one is a child object.
private AddressDO address;
private ArrayList occupation;
Modified UserDO code and AddressDO code is provided below.
UserDO.java
package com.jsession4d; import java.util.ArrayList; public class UserDO { private String name; private long id; private String dob; private AddressDO address; private ArrayList occupation; public String getName() { return name; } public void setName(String name) { this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDob() { return dob; } public void setDob(String dob) { this.dob = dob; } public AddressDO getAddress() { return address; } public void setAddress(AddressDO address) { this.address = address; } public ArrayList getOccupation() { return occupation; } public void setOccupation(ArrayList occupation) { this.occupation = occupation; } public String toString(){ return "Printing UserDO: \nname = " + name + "\n" + "id = " + id + "\n" + "dob = " + dob + "\n" + "Occupation = " + occupation + "\n address -> \n" + address; } }
AddressDO.java
package com.jsession4d; public class AddressDO { private String state; private String country; public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String toString(){ return "state = " + state + "\n" + "country = " + country; } }
Now setting values into UserDOs. //Creating UserDO1. UserDO userDO1 = new UserDO(); userDO1.setId(111); userDO1.setName("Dinosaur"); userDO1.setDob("200 million BCE"); AddressDO addressDO = new AddressDO(); addressDO.setState("Gobi desert"); addressDO.setCountry("Mongolia"); userDO1.setAddress(addressDO); ArrayList occupationList = new ArrayList(); occupationList.add("Hunting"); occupationList.add("Scavenging"); userDO1.setOccupation(occupationList); //Creating UserDO2. UserDO userDO2 = new UserDO(); userDO2.setId(222); userDO2.setName("Tyrannosaurus"); userDO2.setDob("68 million BCE"); //Setting both UserDO1 and UserDO2 into an ArrayList. ArrayList<UserDO> userDOList = new ArrayList(); userDOList.add(userDO1); userDOList.add(userDO2);
Now converting userDO1 to JSON and printing it.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting userDO to JSON String and printing. String userDO1_Json = mapper.writeValueAsString(userDO1); System.out.println("JSON String of UserDO1 :\n" + userDO1_Json);
Output:
JSON String of UserDO1 : {"name":"Dinosaur","id":111,"dob":"200 million BCE","address":{"state":"Gobi desert","country":"Mongolia"},"occupation":["Hunting","Scavenging"]}
Now converting userDOList ArrayList to JSON and printing it.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting userDO arrayList to JSON String. String userDOArrayList_Json = mapper.writeValueAsString(userDOList); System.out.println("JSON String of ArrayList :\n" + userDOArrayList_Json);
Output:
JSON String of ArrayList : [{"name":"Dinosaur","id":111,"dob":"200 million BCE","address":{"state":"Gobi desert","country":"Mongolia"},"occupation":["Hunting","Scavenging"]},{"name":"Tyrannosaurus","id":222,"dob":"68 million BCE","address":null,"occupation":null}]
Now converting userDO1_Json back to UserDO object.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting UserDO1 JSON back to UserDO UserDO UserDO1_FromJSON = mapper.readValue(userDO1_Json, UserDO.class); System.out.println("\n\n"+ UserDO1_FromJSON);
Output: (It is printing the overridded toString method’s content of UserDO)
Printing UserDO: name = Dinosaur id = 111 dob = 200 million BCE Occupation = [Hunting, Scavenging] address -> state = Gobi desert country = Mongolia
Now converting userDOArrayList_Json back to ArrayList object.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting userDOArrayList JSON back to Arraylist of UserDOs. ArrayList<UserDO> userDOArrayList_fromJSON = mapper.readValue(userDOArrayList_Json, new TypeReference<ArrayList<UserDO>>() {}); System.out.println("\nPrint UserDOArrayList_FromJSON :\n" + userDOArrayList_fromJSON);
Output: (It is printing the ArrayList of UserDOs : userDOArrayList_fromJSON. Note the value of Occupation and address is null for the second UserDO object. This is because these properties are not availabe in JSON and hence printing the default values of these properties in UserDO object. If these properties are instantiated with any other values, that will get printed instead of null)
Print UserDOArrayList_FromJSON : [Printing UserDO: name = Dinosaur id = 111 dob = 200 million BCE Occupation = [Hunting, Scavenging] address -> state = Gobi desert country = Mongolia, Printing UserDO: name = Tyrannosaurus id = 222 dob = 68 million BCE Occupation = null address -> null]
So far so good. Now lets create a new object which will have an ArrayList of UserDOs and lets call it UserListDO
UserListDO.java
package com.jsession4d; import java.util.ArrayList; public class UserListDO { private ArrayList<UserDO> userDOlist; public ArrayList<UserDO> getUserDOlist() { return userDOlist; } public void setUserDOlist(ArrayList<UserDO> userDOlist) { this.userDOlist = userDOlist; } public String toString(){ return "Printing UserListDO Contents : " + userDOlist.toString(); } }
Now loading the ArrayList of UserDOs into UserListDO object.
//Setting both UserDO1 and UserDO2 into an ArrayList. ArrayList<UserDO> userDOList = new ArrayList(); userDOList.add(userDO1); userDOList.add(userDO2); //Creating UserlistDO UserListDO userlistDO = new UserListDO(); userlistDO.setUserDOlist(userDOList);
Converting the UserListDO object to JSON string and printing.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting userlistDO Object to JSON String. String userlistObject_Json = mapper.writeValueAsString(userlistDO); System.out.println("JSON String of userlistDO : \n" + userlistObject_Json);
Output:
JSON String of userlistDO : {"userDOlist":[{"name":"Dinosaur","id":111,"dob":"200 million BCE","address":{"state":"Gobi desert","country":"Mongolia"},"occupation":["Hunting","Scavenging"]},{"name":"Tyrannosaurus","id":222,"dob":"68 million BCE","address":null,"occupation":null}]}
Converting the above UserListDO json back into UserListDO object.
//Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting UserDO1 JSON back to UserDO UserListDO userListDO_fromJSON = mapper.readValue(userlistObject_Json, UserListDO.class); System.out.println("\n" + userListDO_fromJSON);
Output:
Printing UserListDO Contents : [Printing UserDO: name = Dinosaur id = 111 dob = 200 million BCE Occupation = [Hunting, Scavenging] address -> state = Gobi desert country = Mongolia, Printing UserDO: name = Tyrannosaurus id = 222 dob = 68 million BCE Occupation = null address -> null]
So Jackson proves its purpose.
The full code of RunJackson.java used in this tutorial is provided below.
RunJackson.java
package com.jsession4d; import java.util.ArrayList; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.jsession4d.UserDO; public class RunJackson { public static void main(String[] args) { // TODO Auto-generated method stub try{ //Creating UserDO1. UserDO userDO1 = new UserDO(); userDO1.setId(111); userDO1.setName("Dinosaur"); userDO1.setDob("200 million BCE"); AddressDO addressDO = new AddressDO(); addressDO.setState("Gobi desert"); addressDO.setCountry("Mongolia"); userDO1.setAddress(addressDO); ArrayList occupationList = new ArrayList(); occupationList.add("Hunting"); occupationList.add("Scavenging"); userDO1.setOccupation(occupationList); //Creating UserDO2. UserDO userDO2 = new UserDO(); userDO2.setId(222); userDO2.setName("Tyrannosaurus"); userDO2.setDob("68 million BCE"); //Setting both UserDO1 and UserDO2 into an ArrayList. ArrayList<UserDO> userDOList = new ArrayList(); userDOList.add(userDO1); userDOList.add(userDO2); //Creating UserlistDO UserListDO userlistDO = new UserListDO(); userlistDO.setUserDOlist(userDOList); //Creating jackson Objectmapper object. ObjectMapper mapper = new ObjectMapper(); //Converting userDO to JSON String and printing. String userDO1_Json = mapper.writeValueAsString(userDO1); System.out.println("JSON String of UserDO1 :\n" + userDO1_Json); //Converting userDO arrayList to JSON String. String userDOArrayList_Json = mapper.writeValueAsString(userDOList); System.out.println("JSON String of ArrayList :\n" + userDOArrayList_Json); //Converting userlistDO Object to JSON String. String userlistObject_Json = mapper.writeValueAsString(userlistDO); System.out.println("JSON String of userlistDO : \n" + userlistObject_Json); //Converting UserDO1 JSON back to UserDO UserDO UserDO1_FromJSON = mapper.readValue(userDO1_Json, UserDO.class); System.out.println("\n\n"+ UserDO1_FromJSON); //Converting userDOArrayList JSON back to Arraylist of UserDOs. ArrayList<UserDO> userDOArrayList_fromJSON = mapper.readValue(userDOArrayList_Json, new TypeReference<ArrayList<UserDO>>() {}); System.out.println("\nPrint UserDOArrayList_FromJSON :\n" + userDOArrayList_fromJSON); //Converting UserDO1 JSON back to UserDO UserListDO userListDO_fromJSON = mapper.readValue(userlistObject_Json, UserListDO.class); System.out.println("\n" + userListDO_fromJSON); }catch(Exception e){ e.printStackTrace(); } } }