Jackson @JsonProperty and @JsonAlias
March 11, 2018
On this page we will provide Jackson @JsonProperty
and @JsonAlias
annotation example. @JsonProperty
defines a logical property used in serialization and deserialization of JSON. When we set JSON data to Java Object, it is called JSON deserialization and when we get JSON data from Java Object, it is called JSON serialization. @JsonProperty
can change the visibility of logical property using its access
element during serialization and deserialization of JSON. @JsonAlias
defines one or more alternative names for a property to be accepted during deserialization. At the time of serialization only actual logical property name is used and not alias. @JsonProperty
can also be used with Enum. Here on this page we will provide complete example of @JsonProperty
and @JsonAlias
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. @JsonProperty
@JsonProperty
is a marker annotation to define logical property. @JsonProperty
can be annotated at non-static setter or getter method or non-static object field. The logical property is used in serialization and de-serialization of JSON. @JsonProperty
is annotated as following.
1. Using object field.
@JsonProperty("bookCategory") private String category;
@JsonProperty("bookCategory") public String getCategory() { return category; }
@JsonProperty("bookCategory") public void setCategory(String category) { this.category = category; }
bookCategory
. If we do not assign any value to @JsonProperty
, for example.
@JsonProperty private String category;
category
. If we are not providing any value, then annotating @JsonProperty
to a property is optional.
3. @JsonProperty Elements
The elements of@JsonProperty
are as follows.
value: Defines name of logical property.
access: Changes the visibility of logical property in serialization and deserialization.
defaultValue: It is used to document expected default value.
index: Defines numerical index of the property related to other properties specified by object.
required: Defines whether the value for the property is required or not during deserialization.
3.1. @JsonProperty value
value
element defines the name of logical property.
@JsonProperty(value= "bookCategory") private String category;
value
element, we can assign logical property as following.
@JsonProperty("bookCategory") private String category;
3.2. @JsonProperty access
access
element changes the visibility of logical property defined by getter or setter or object field. The values of access
can be one of followings.
Access.WRITE_ONLY: The visibility of logical property will be only available when we set JSON data to Java object i.e. at the time of deserialization.
Access.READ_ONLY: The visibility of logical property will be only available when we get JSON data from Java object i.e. at the time of serialization.
Access.READ_WRITE: The visibility of logical property will be available at both the time serialization and deserialization.
Access.AUTO: The visibility of logical property will be determined automatically which is the default value of
access
element.
We can define it as follows.
@JsonProperty(value= "bookCategory", access=Access.WRITE_ONLY) private String category;
bookCategory
will be only available at the time of deserialization and not for serialization.
4. @JsonProperty with Enum
Here we will use@JsonProperty
with Enum. Suppose we have defined Enum as given below.
public enum Gender { @JsonProperty("male") GENDER_MALE, @JsonProperty("female") GENDER_FEMALE; }
ObjectMapper
as given below,
ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(Gender.GENDER_FEMALE));
"female"
@JsonProperty
then output will be
"GENDER_FEMALE"
5. @JsonAlias
@JsonAlias
is introduced in Jackson 2.9 release. @JsonAlias
defines one or more alternative names for a property to be accepted during deserialization i.e. setting JSON data to Java object. But at the time of serialization i.e. while getting JSON from Java object, only actual logical property name is used and not alias. @JsonAlias
is defined as follows.
@JsonAlias({"bkcat", "mybkcat"}) private String category;
category
and alias is bkcat
and mybkcat
. Now the above property will set value from JSON for JSON field name bkcat
, mybkcat
and category
. If we are defining logical property using @JsonProperty
, both @JsonProperty
and @JsonAlias
can be used as following.
@JsonProperty("bookCategory") @JsonAlias({"bkcat", "mybkcat"}) private String category;
bookCategory
and alias is bkcat
and mybkcat
. At the time of deserialization either JSON is
{ "bookCategory" : "Java" }
{ "bkcat" : "Java" }
{ "mybkcat" : "Java" }
category
. But when we serialization, we will get JSON only with actual logical property name as given below.
{ "bookCategory" : "Java" }
6. 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.JsonAlias; import com.fasterxml.jackson.annotation.JsonProperty; public class Book { @JsonProperty("bookName") private String name; @JsonProperty("bookCategory") @JsonAlias({"bkcat", "mybkcat"}) private String category; public Book(){} public Book(String name, String category) { this.name = name; this.category = category; } 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.JsonAlias; import com.fasterxml.jackson.annotation.JsonProperty; public class Writer { @JsonProperty("writerId") private Integer id; @JsonProperty("writerName") @JsonAlias({"wname", "mywname"}) private String name; @JsonProperty("writerBook") private Book book; public Writer(){} public Writer(Integer id, String name, Book book){ this.id = id; this.name = name; this.book = book; } 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; } }
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," +"\"mywname\" : \"Mahesh\"," +"\"writerBook\" : {" +"\"bookName\" : \"Learning Spring\"," +"\"bkcat\" : \"Spring\"" +"}" +"}"; ObjectMapper mapper = new ObjectMapper(); Writer writer = mapper.readValue(jsonData, Writer.class); System.out.println(writer.getId()+", "+ writer.getName()); Book book = writer.getBook(); System.out.println(book.getName()+", "+ book.getCategory()); } }
111, Mahesh Learning Spring, Spring
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("Learning Java", "Java"); Writer writer = new Writer(110, "Mohit", book); String jsonWriter = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(writer); System.out.println(jsonWriter); } }
{ "writerId" : 110, "writerName" : "Mohit", "writerBook" : { "bookName" : "Learning Java", "bookCategory" : "Java" } }
7. References
Annotation Type JsonPropertyAnnotation Type JsonAlias