当我尝试反序列化Automobile类时,我得到以下错误。杰克逊试图在父类中搜索子元素中的字段。如何确保jackson使用适当的子类型进行反序列化?我相信我需要使用miixins /客户转换器。但我不确定如何在这种特定情况下使用它们。
注意:在我的情况下,除了TestMain之外的所有类都在一个jar文件中,我无法修改源文件。
错误
线程中的异常" main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段"颜色" (类com.salesportal.proxy.Car),不是 标记为可忽略(一个已知属性:"名称"])
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字符串
{"cars":[{"name":"Toyota","color":"Silver Grey"}]}
答案 0 :(得分:2)
Vicky,您可以在JACKSON中使用子类型注释。以下内容适用于我,只需进行此更改
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;
}
}
答案 1 :(得分:1)
Automobile
类没有颜色属性。
改变这个:
Automobile auto = mapper.readValue(mapper.writeValueAsString(automobile), Automobile.class);
到此:
Corolla auto = mapper.readValue(mapper.writeValueAsString(automobile.getCars()), Corolla .class);