以下是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]])
我无法理解为什么"员工"被视为财产。假设只有类成员被视为属性,我错了吗?
答案 0 :(得分:5)
问题是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注释。没有这个模块,它们将无法工作。
答案 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());