By default, ObjectMapper instance access the properties that are public
fields or have public getters/setters. Let’s confirm the same with an example.
Employee.java
package com.sample.app.model;
public class Employee {
private String firstName;
private String lastName;
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Employee [firstName=");
builder.append(firstName);
builder.append(", lastName=");
builder.append(lastName);
builder.append("]");
return builder.toString();
}
}
App.java
package com.sample.app;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sample.app.model.Employee;
public class App {
public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException {
String json = "{\"firstName\":\"Krishna\",\"lastName\":\"Ponnam\"}";
ObjectMapper mapper = new ObjectMapper();
Employee emp = mapper.readValue(json, Employee.class);
System.out.println(emp);
}
}
When you ran App.java, you will get UnrecognizedPropertyException.
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "firstName" (class com.sample.app.model.Employee), not marked as ignorable (0 known properties: ])
at [Source: {"firstName":"Krishna","lastName":"Ponnam"}; line: 1, column: 15] (through reference chain: com.sample.app.model.Employee["firstName"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1045)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1352)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1330)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3736)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726)
at com.sample.app.App.main(App.java:16)
How can ObjectMapper access private properties?
Set field visibility of mapper to ANY.
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
App.java
package com.sample.app;
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sample.app.model.Employee;
public class App {
public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException {
String json = "{\"firstName\":\"Krishna\",\"lastName\":\"Ponnam\"}";
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
Employee emp = mapper.readValue(json, Employee.class);
System.out.println(emp);
}
}
Run App.java, you will get below message in console.
Employee [firstName=Krishna, lastName=Ponnam]
No comments:
Post a Comment