com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException - 杰克逊图书馆

时间:2016-08-15 03:26:42

标签: java json spring jackson mixins

当我尝试反序列化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"}]}

2 个答案:

答案 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);