杰克逊没有认识到类名的字段

mav*_*ick 4 java json jackson

以下是JSON字符串的外观

{
    "employee": {
        "id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
        "name": "smith"
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我用ObjectMapper#readValue(jsonAsStr,Employee.class)它将它转换为JSON.我的Employee班级如下......

@XmlRootElement(name="employee")
public class Employee implements Serializable {
    private String id;
    private String name;
    ...

    public Employee() {
    }

    @XmlElement(name="id")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id= id;
    }

    @XmlElement(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "employee" (class com.abc.Employee), not marked as
ignorable (12 known properties: , "id", "name", ... [truncated]])
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么"员工"被视为财产.假设只有班级成员被视为财产,我错了吗?

Pau*_*tha 5

问题是JSON对象{ }映射到Java类,JSON中的属性映射到Java属性.{ }你的JSON中的第一个(你试图解组Employee),有一个属性employee,Employee该类没有属性.这就是你得到错误的原因.如果你只是尝试解组封闭的{ }

{
  "id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
  "name": "smith"
}
Run Code Online (Sandbox Code Playgroud)

它会像Employee那些属性一样工作.如果您无法控制JSON,则可以配置ObjectMapper以解包根值

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
Run Code Online (Sandbox Code Playgroud)

但是你可能还有另外一个问题.展开是基于Employee类的注释,@JsonRootName("employee")或者@XmlRootElement(name = "employee").但是,使用后者,您需要确保您具有JAXB注释支持.为此,您需要使用jackson-module-jaxb-annotations,然后注册模块

mapper.registerModule(new JaxbAnnotationModule());
Run Code Online (Sandbox Code Playgroud)

这适用于您正在使用的所有JAXB注释.没有这个模块,它们将无法工作.