Jackson - Serialization Annotations
- Jackson - @JsonAnyGetter
- Jackson - @JsonGetter
- Jackson - @JsonPropertyOrder
- Jackson - @JsonRawValue
- Jackson - @JsonValue
- Jackson - @JsonRootName
- Jackson - @JsonSerialize
Jackson - Deserialization Annotations
- Jackson - @JsonCreator
- Jackson - @JacksonInject
- Jackson - @JsonAnySetter
- Jackson - @JsonSetter
- Jackson - @JsonDeserialize
- Jackson - @JsonEnumDefaultValue
Jackson - Property Inclusion Annotations
- Jackson - @JsonIgnoreProperties
- Jackson - @JsonIgnore
- Jackson - @JsonIgnoreType
- Jackson - @JsonInclude
- Jackson - @JsonAutoDetect
Jackson - Type Handling Annotations
Jackson - General Annotations
- Jackson - @JsonProperty
- Jackson - @JsonFormat
- Jackson - @JsonUnwrapped
- Jackson - @JsonView
- Jackson - @JsonManagedReference
- Jackson - @JsonBackReference
- Jackson - @JsonIdentityInfo
- Jackson - @JsonFilter
Jackson - Miscellaneous
Jackson - Resources
Jackson Annotations - @JsonDeserialize
Overview
@JsonDeserialize annotation is used to specify custom deserializer to unmarshall the json object.
Example - Deserialization without using @JsonDeserialize
JacksonTester.java
package com.tutorialspoint;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mark\",\"dateOfBirth\":\"20-12-1984\"}";
try {
Student student = mapper
.readerFor(Student.class)
.readValue(jsonString);
System.out.println(student.dateOfBirth);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public String name;
public Date dateOfBirth;
}
Output
Run the JacksonTester and verify the output −
com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type 'java.util.Date' from String "20-12-1984": not a valid representation (error: Failed to parse Date value '20-12-1984': Cannot parse date "20-12-1984": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSX", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
at [Source: REDACTED ('StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION' disabled); line: 1, column: 30] (through reference chain: com.tutorialspoint.Student["dateOfBirth"])
at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:2013)
at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:1299)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1426)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1368)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:200)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:302)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:280)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:137)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:302)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:169)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2130)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1565)
at com.tutorialspoint.JacksonTester.main(JacksonTester.java:16)
Example - Deserialization with @JsonDeserialize
JacksonTester.java
package com.tutorialspoint;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mark\",\"dateOfBirth\":\"20-12-1984\"}";
try {
Student student = mapper
.readerFor(Student.class)
.readValue(jsonString);
System.out.println(student.dateOfBirth);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public String name;
@JsonDeserialize(using = CustomDateDeserializer.class)
public Date dateOfBirth;
}
class CustomDateDeserializer extends StdDeserializer<Date> {
private static final long serialVersionUID = 1L;
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
public CustomDateDeserializer() {
this(null);
}
public CustomDateDeserializer(Class t) {
super(t);
}
@Override
public Date deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = parser.getText();
try {
return formatter.parse(date);
}
catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
Output
Run the JacksonTester and verify the output −
Thu Dec 20 00:00:00 IST 1984
Here we can see, without using @JsonDeserialize, Jackson is unable to handle string deserialization to date. Using @JsonDeserialize we can define and set a custom deserializer for us.
Advertisements