【问题标题】:Jackson unrecognized field for class name杰克逊无法识别的类名字段
【发布时间】:2015-04-29 00:41:14
【问题描述】:

以下是 JSON 字符串的外观

{
    "employee": {
        "id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
        "name": "smith"
        ...
    }
}

现在我正在使用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;
    }
    ...
}

我得到的例外是

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

我无法理解为什么“员工”被视为财产。假设只有类成员被视为属性,我错了吗?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    问题在于 JSON 对象 { } 映射到 Java 类,而 JSON 中的属性映射到 Java 属性。 JSON 中的第一个 { }(您试图将其解组为 Employee)具有属性 employee,而 Employee 类没有该属性。这就是您收到错误的原因。如果您要尝试仅解组封闭的 { }

    {
      "id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
      "name": "smith"
    }
    

    Employee 具有这些属性时,它将起作用。如果您无法控制 JSON,则可以配置 ObjectMapper 以解包根值

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    

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

    mapper.registerModule(new JaxbAnnotationModule());
    

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

    【讨论】:

      【解决方案2】:

      @peeskillet 是对的。 我一直在寻找如何使用 jax 注释来反序列化从服务器返回的 json,因为我也遇到了 UnrecognizedPropertyException。

      添加以下代码解决了我的问题: mapper.registerModule(new JaxbAnnotationModule());

      按照下面我使用的整个代码: ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JaxbAnnotationModule()); List<PojoTO>response = mapper.readValue(result.readEntity(String.class), mapper.getTypeFactory().constructCollectionType(List.class, PojoTO.class));

      【讨论】:

        猜你喜欢
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        相关资源
        最近更新 更多