Reputation: 16982
I get the below error when I try to deserialize Automobile class. Jackson is trying to search for the field in child element in parent class. How can I make sure jackson uses the appropriate child type for deserialization? I believe I need to use miixins / customer converters. But i'm not sure how to use them in this specific scenario.
Note: In my case all classes except TestMain are in a jar file and I cannot modify the source files.
Error
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "color" (class com.salesportal.proxy.Car), not marked as ignorable (one known property: "name"])
Automobile.java
public class Automobile {
private Car[] cars;
public Car[] getCars() {
return cars;
}
public void setCars(Car[] cars) {
this.cars = cars;
}
}
Car.java
public class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Corolla.java
public class Corolla extends Car {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
TestMain.java
import java.io.IOException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJSON {
public static void main(String[] args) throws IOException{
ObjectMapper mapper = new ObjectMapper();
Automobile automobile = new Automobile();
Corolla corolla = new Corolla();
corolla.setName("Toyota");
corolla.setColor("Silver Grey");
automobile.setCars(new Corolla[]{corolla});
System.out.println(mapper.writeValueAsString(automobile));
Automobile auto = mapper.readValue(mapper.writeValueAsString(automobile), Automobile.class);
}
}
JSON String
{"cars":[{"name":"Toyota","color":"Silver Grey"}]}
Upvotes: 1
Views: 1468
Reputation: 4948
Vicky , you can use sub type annotations in JACKSON. The below works for me , with just this change
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = Corolla.class, name = "color") })
public class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Upvotes: 2
Reputation: 1671
Automobile
class doesn't have color property.
Change this :
Automobile auto = mapper.readValue(mapper.writeValueAsString(automobile), Automobile.class);
to this :
Corolla auto = mapper.readValue(mapper.writeValueAsString(automobile.getCars()), Corolla .class);
Upvotes: 1