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

时间:2015-04-29 00:41:14

标签: java json jackson

以下是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]])

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

2 个答案:

答案 0 :(得分:5)

问题是JSON对象{ }映射到Java类,而JSON中的属性映射到Java属性。您的JSON中的第一个{ }(您尝试解组为Employee)具有属性employeeEmployee类没有属性。这就是你得到错误的原因。如果您只是尝试解组所附的{ }

{
  "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注释。没有这个模块,它们将无法工作。

答案 1 :(得分:0)

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

添加以下代码修复了我的问题: private void button4_Click(object sender, EventArgs e) { listView1.SelectedItems.Clear(); for (int i = listView1.Items.Count -1; i >= 0; i--) { if (listView1.Items[i].ToString().ToLower().Contains(searchBox.Text.ToLower())) { listView1.Items[i].Selected = true; } }

按照我使用的整个代码进行操作: mapper.registerModule(new JaxbAnnotationModule());