Jackson @JsonIgnore, @JsonIgnoreProperties and @JsonIgnoreType
March 16, 2018
This page will walk through Jackson @JsonIgnore
, @JsonIgnoreProperties
and @JsonIgnoreType
annotations example. These annotations are used to ignore logical properties in JSON serialization and deserialization. @JsonIgnore
is annotated at a class property level to ignore it. @JsonIgnoreProperties
is annotated at class level and we need to specify the logical properties of that class to ignore them. @JsonIgnoreType
is annotated at class level and it ignores the complete class. @JsonIgnore
and @JsonIgnoreType
has an element value
which accepts Boolean values to make it active and inactive. @JsonIgnoreProperties
has elements that are allowGetters
, allowSetters
, ignoreUnknown
and value
. The element value
in @JsonIgnoreProperties
specifies the names of properties to ignore. On this page we will provide complete example to use @JsonIgnore
, @JsonIgnoreProperties
and @JsonIgnoreType
in JSON serialization and deserialization step by step.
Contents
1. Technologies Used
Find the technologies being used in our example.1. Java 9
2. Jackson 2.9.4
3. Gradle 4.3.1
4. Eclipse Oxygen
2. @JsonIgnore
@JsonIgnore
is used to ignore the logical property used in serialization and deserialization. @JsonIgnore
can be used at setter, getter or field. It is used as following.
Using field:
@JsonIgnore private String category;
@JsonIgnore public String getCategory() { return category; }
@JsonIgnore public void setCategory(String category) { this.category = category; }
category
. In deserialization, application will throw exception as Unrecognized field "category". In serialization there will be no category
field in JSON output. @JsonIgnore
can be used with @JsonProperty
as given below.
@JsonIgnore @JsonProperty("bookCategory") private String category;
bookCategory
. As we are using @JsonIgnore
, so during JSON serialization and deserialization the logical property bookCategory
will not be available.
@JsonIgnore
has element value
which is optional. Using Boolean we can make it active and inactive. We can use it as following.
@JsonIgnore(false) private String category;
@JsonIgnore
inactive by passing false
value. Now the logical property category
will be available in JSON serialization and deserialization.
3. @JsonIgnoreProperties
@JsonIgnoreProperties
ignores the specified logical properties in JSON serialization and deserialization. It is annotated at class level. Find the code snippet.
@JsonIgnoreProperties({ "bookName", "bookCategory" }) public class Book { @JsonProperty("bookId") private String id; @JsonProperty("bookName") private String name; @JsonProperty("bookCategory") private String category; ------ }
bookName
and bookCategory
has been specified in @JsonIgnoreProperties
annotation. So these logical properties will not take part in JSON serialization and deserialization. If other logical properties such as bookId
has been annotated with @JsonIgnore
then all these logical properties will be ignored in JSON serialization and deserialization. It means the union of logical properties ignored by @JsonIgnore
and @JsonIgnoreProperties
are considered to be ignored in JSON serialization and deserialization.
@JsonIgnoreProperties
has elements that are allowGetters
, allowSetters
, ignoreUnknown
and value
. The element value
specifies name of properties to ignore.
3.1. @JsonIgnoreProperties allowGetters
When we passtrue
to allowGetters
element, the getters will be allowed for the specified logical properties. It means the specified logical properties in @JsonIgnoreProperties
will take part in JSON serialization but not in deserialization.
@JsonIgnoreProperties(value={ "bookName", "bookCategory" }, allowGetters= true) public class Book { ------ }
bookName
and bookCategory
will take part in JSON serialization but not in deserialization.
3.2. @JsonIgnoreProperties allowSetters
When we passtrue
to allowSetters
element, the setters will be allowed for the specified logical properties. It means the specified logical properties in @JsonIgnoreProperties
will take part in JSON deserialization but not in serialization.
@JsonIgnoreProperties(value={ "bookName", "bookCategory" }, allowSetters= true) public class Book { ------ }
bookName
and bookCategory
will take part in JSON deserialization but not in serialization.
3.3. @JsonIgnoreProperties ignoreUnknown
When we passtrue
to ignoreUnknown
element, then in deserialization if JSON data has a field for which there is no logical property then that JSON field will be ignored and no error will be thrown. It can be used as following.
@JsonIgnoreProperties(ignoreUnknown = true) public class Book { @JsonProperty("bookId") private String id; @JsonProperty("bookName") private String name; @JsonProperty("bookCategory") private String category; }
bookId
, bookName
and bookCategory
logical properties. Suppose we have a JSON data with some unknown fields.
{ "bookId" : "A101", "bookName" : "Learning Java", "bookCategory" : "Java", "pubYear" : "2018", "price" : "200", }
pubYear
and price
has no corresponding logical properties in Book
class. In deserialization, we will not get exception because we are using ignoreUnknown = true
in @JsonIgnoreProperties
annotation.
4. @JsonIgnoreType
@JsonIgnoreType
can be annotated at class level. It ignores all logical properties of annotated class in JSON serialization and deserialization. It is used as following.
@JsonIgnoreType public class Address { @JsonProperty("city") private String city; @JsonProperty("country") private String country; ------ }
Address
is being used in Writer
class.
public class Writer { ------ @JsonProperty("writerAddress") private Address address; }
writerAddress
will be ignored in serialization and deserialization of Writer
class.
@JsonIgnoreType
has element value
which is optional. Using Boolean we can make it active and inactive. We can use it as following.
@JsonIgnoreType(false) public class Address { ------ }
@JsonIgnoreType
inactive by passing false
value. Now the Address
class will be available in JSON serialization and deserialization.
5. Complete Example
build.gradleapply plugin: 'java' apply plugin: 'eclipse' archivesBaseName = 'concretepage' version = '1' repositories { mavenCentral() } dependencies { compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.4' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4' compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.4' }
package com.concretepage; import com.fasterxml.jackson.annotation.JsonIgnoreType; import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreType public class Address { @JsonProperty("city") private String city; @JsonProperty("country") private String country; public Address() {} public Address(String city, String country) { this.city = city; this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
package com.concretepage; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties({"bookName", "bookCategory"}) public class Book { @JsonProperty("bookId") private String id; @JsonProperty("bookName") private String name; @JsonProperty("bookCategory") private String category; public Book(){} public Book(String id, String name, String category) { this.id = id; this.name = name; this.category = category; } 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 String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }
package com.concretepage; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; public class Writer { @JsonProperty("writerId") private Integer id; @JsonIgnore @JsonProperty("writerName") private String name; @JsonProperty("writerBook") private Book book; @JsonProperty("writerAddress") private Address address; public Writer(){} public Writer(Integer id, String name, Book book, Address address){ this.id = id; this.name = name; this.book = book; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
ObjectToJSON.java
package com.concretepage; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class ObjectToJSON { public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); Book book = new Book("A101", "Learning Java", "Java"); Address address = new Address("Noida", "India"); Writer writer = new Writer(110, "Mohit", book, address); String jsonWriter = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(writer); System.out.println(jsonWriter); } }
{ "name" : "Mohit", "writerId" : 110, "writerBook" : { "bookId" : "A101" } }
@JsonIgnore
nor @JsonIgnoreProperties
nor @JsonIgnoreType
in the above example then the output will be as given below.
{ "writerId" : 110, "writerName" : "Mohit", "writerBook" : { "bookId" : "A101", "bookName" : "Learning Java", "bookCategory" : "Java" }, "writerAddress" : { "city" : "Noida", "country" : "India" } }
JSONToObject.java
package com.concretepage; import java.io.IOException; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JSONToObject { public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { String jsonData = "{" +"\"writerId\" : 111," // +"\"writerName\" : \"Mahesh\"," +"\"writerBook\" : {" +"\"bookId\" : \"A101\"" // +"\"bookName\" : \"Learning Spring\"," // +"\"bookCategory\" : \"Spring\"" +"}" // +"\"writerAddress\" : {" // +"\"city\" : \"Noida\"," // +"\"country\" : \"India\"" // +"}" +"}"; ObjectMapper mapper = new ObjectMapper(); Writer writer = mapper.readValue(jsonData, Writer.class); System.out.println(writer.getId()); //System.out.println(writer.getName()); Book book = writer.getBook(); System.out.println(book.getId()); //System.out.println(book.getName()+", "+ book.getCategory()); //System.out.println(book.getName()+", "+ book.getCategory()); // Address address = writer.getAddress(); // System.out.println(address.getCity()+", "+ address.getCountry()); } }
111 A101
6. References
Annotation Type JsonIgnoreAnnotation Type JsonIgnoreProperties
Annotation Type JsonIgnoreType