原文地址:
Create JSON by Jackson API
Jackson API is a multi-purpose Java library for processing JSON. Using Jackson API we can process as well produce JSON in different ways. In this article we will show how to use this Jackson API for creating JSON.
Maven Dependency:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.0</version> </dependency>
Example 1:Jackson API to create JSON Array
package com.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class CreateJSON { public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); ArrayNode arrayNode = mapper.createArrayNode(); /** * Create three JSON Objects objectNode1, objectNode2, objectNode3 * Add all these three objects in the array */ ObjectNode objectNode1 = mapper.createObjectNode(); objectNode1.put("bookName", "Java"); objectNode1.put("price", "100"); ObjectNode objectNode2 = mapper.createObjectNode(); objectNode2.put("bookName", "Spring"); objectNode2.put("price", "200"); ObjectNode objectNode3 = mapper.createObjectNode(); objectNode3.put("bookName", "Liferay"); objectNode3.put("price", "500"); /** * Array contains JSON Objects */ arrayNode.add(objectNode1); arrayNode.add(objectNode2); arrayNode.add(objectNode3); /** * We can directly write the JSON in the console. * But it wont be pretty JSON String */ System.out.println(arrayNode.toString()); /** * To make the JSON String pretty use the below code */ System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(arrayNode)); } }
The above code will produce the below JSON
[ { "bookName": "Java", "price": "100" }, { "bookName": "Spring", "price": "200" }, { "bookName": "Liferay", "price": "500" } ]
Example 2: Jackson API to create JSON Array inside JSON Array
package com.sample; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class CreateJSON { public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); ArrayNode arrayNode = mapper.createArrayNode(); /** * Create three JSON Objects objectNode1, objectNode2, objectNode3, objectNode4 * Add all these three objects in the array */ ObjectNode objectNode1 = mapper.createObjectNode(); objectNode1.put("bookName", "Java"); objectNode1.put("price", "100"); ObjectNode objectNode2 = mapper.createObjectNode(); objectNode2.put("bookName", "Spring"); objectNode2.put("price", "200"); ObjectNode objectNode3 = mapper.createObjectNode(); objectNode3.put("bookName", "Liferay"); objectNode3.put("price", "500"); ArrayNode authorsArray = mapper.createArrayNode(); ObjectNode author1 = mapper.createObjectNode(); author1.put("firstName","Hamidul"); author1.put("middleName",""); author1.put("lastName","Islam"); ObjectNode author2 = mapper.createObjectNode(); author2.put("firstName","Richard"); author2.put("middleName",""); author2.put("lastName","Sezove"); authorsArray.add(author1); authorsArray.add(author2); ObjectNode objectNode4 = mapper.createObjectNode(); objectNode4.putPOJO("authors", authorsArray); /** * Array contains JSON Objects */ arrayNode.add(objectNode1); arrayNode.add(objectNode2); arrayNode.add(objectNode3); arrayNode.add(objectNode4); /** * We can directly write the JSON in the console. * But it wont be pretty JSON String */ //System.out.println(arrayNode.toString()); /** * To make the JSON String pretty use the below code */ System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(arrayNode)); } }
The above code will produce the below JSON String
[ { "bookName": "Java", "price": "100" }, { "bookName": "Spring", "price": "200" }, { "bookName": "Liferay", "price": "500" }, { "authors": [ { "firstName": "Hamidul", "middleName": "", "lastName": "Islam" }, { "firstName": "Richard", "middleName": "", "lastName": "Sezove" } ] } ]
Example 3: Jackson API to convert Java Object to JSON
package com.sample.pojo; import java.util.List; public class Customer { private String firstName; private String middleName; private String lastName; private int age; private List<String> contacts; public List<String> getContacts() { return contacts; } public void setContacts(List<String> contacts) { this.contacts = contacts; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Convert Customer to JSON
package com.sample; import java.io.File; import java.io.IOException; import java.util.Arrays; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.sample.pojo.Customer; public class ObjectToJSON { public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException { /** * Mapper can be used to convert object to JSON */ ObjectMapper mapper = new ObjectMapper(); Customer customer = new Customer(); customer.setAge(29); customer.setFirstName("Hamidul"); customer.setMiddleName(""); customer.setLastName("Islam"); customer.setContacts( Arrays.asList("8095185442", "9998887654", "1234567890")); /** * Now we can create JSON from customer object * Into different forms * We can write in Console or we can create JSON as string * Or we can write JSON in file also * See all the examples below */ mapper.writeValue(System.out, customer); String jsonString = mapper.writeValueAsString(customer); mapper.writeValue(new File("customer.json"), customer); /** * To pretty print the above JSON use the below code. * Uncomment the below code to see the result */ /**mapper.writerWithDefaultPrettyPrinter().writeValue(System.out, customer); String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(customer); mapper.writerWithDefaultPrettyPrinter().writeValue(new File("customer.json"), customer);*/ } }
The above code will produce JSON as below
{ "firstName": "Hamidul", "middleName": "", "lastName": "Islam", "age": 29, "contacts": [ "8095185442", "9998887654", "1234567890" ] }
Example 4: Use of @JsonIgnore to ignore property
Some times while converting java objects to json we may require certain properties to be ignored.
In that case we can use @JsonIgnore annotation. For example
package com.sample.pojo; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; public class Customer { private String firstName; private String middleName; private String lastName; private int age; private List<String> contacts; @JsonIgnore private String country; @JsonIgnore private String city; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public List<String> getContacts() { return contacts; } public void setContacts(List<String> contacts) { this.contacts = contacts; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
So while converting customer object to JSON, the property country and city will be ignored.
Example 5: Ignore property in the runtime
In the example 4 we have shown how to ignore property by @JsonIgnore. This is static in nature. That means each and every time the property will be ignored while converting object to JSON. But in some cases we may need to ignore property in the runtime on the basis of some conditions.
package com.sample.pojo; import java.util.List; import com.fasterxml.jackson.annotation.JsonFilter; @JsonFilter("com.sample.pojo.Customer") public class Customer { private String firstName; private String middleName; private String lastName; private int age; private List<String> contacts; private String country; private String city; public List<String> getContacts() { return contacts; } public void setContacts(List<String> contacts) { this.contacts = contacts; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Customer(String firstName, String middleName, String lastName, int age) { super(); this.firstName = firstName; this.middleName = middleName; this.lastName = lastName; this.age = age; } public Customer() { } }
Note: Give attention to @JsonFilter("com.sample.pojo.Customer"). Within double quote we can pass any valid string.
package com.sample; import java.util.Arrays; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.sample.pojo.Customer; public class DynamicExclusionDemo { public static void main(String[] args) throws JsonProcessingException{ /** * Create customer object */ Customer customer = new Customer(); customer.setAge(29); customer.setFirstName("Hamidul"); customer.setMiddleName(""); customer.setLastName("Islam"); customer.setCountry("India"); customer.setCity("Bangalore"); customer.setContacts( Arrays.asList("8095185442", "9998887654", "1234567890")); /** * Ignore city and country property */ String[] ignorableFieldNames = {"city","country"}; /** * In the add filter pass com.sample.pojo.Customer * Which is mentioned in the Customer class with @JsonFilter */ FilterProvider filters = new SimpleFilterProvider() .addFilter("com.sample.pojo.Customer", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); ObjectMapper mapper = new ObjectMapper(); /** * Pass the filter */ ObjectWriter writer = mapper.writer(filters); /** * Convert Object to JSON */ String jsonString = writer.writeValueAsString(customer); System.out.println(jsonString); } }
The JSON output is below