class 名称的杰克逊无法识别的字段
Jackson unrecognized field for class name
以下是 JSON 字符串的样子
{
"employee": {
"id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
"name": "smith"
...
}
}
现在我正在使用 ObjectMapper#readValue(jsonAsStr,Employee.class)
将其转换为 JSON。
我的Employee
class如下...
@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]])
我无法理解为什么 "employee" 被认为是 属性。我假设只有 class 成员被视为属性是错误的吗?
问题是 JSON 对象 { }
映射到 Java class,JSON 中的属性映射到 Java 属性。您的 JSON 中的第一个 { }
(您正试图解组为 Employee
)有一个 属性 employee
,其中 Employee
class 没有 属性。这就是你收到错误的原因。如果您要尝试仅解组随附的 { }
{
"id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
"name": "smith"
}
它会起作用,因为 Employee
具有这些属性。如果您无法控制 JSON,那么您可以配置 ObjectMapper
来解包根值
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
但是您可能还有另一个问题。展开基于 Employee
class 上的注释,@JsonRootName("employee")
或 @XmlRootElement(name = "employee")
。但是对于后者,您需要确保具有 JAXB 注释支持。为此,您需要 jackson-module-jaxb-annotations,然后注册模块
mapper.registerModule(new JaxbAnnotationModule());
这适用于您正在使用的所有 JAXB 注释。没有这个模块,它们将无法工作。
@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));
以下是 JSON 字符串的样子
{
"employee": {
"id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
"name": "smith"
...
}
}
现在我正在使用 ObjectMapper#readValue(jsonAsStr,Employee.class)
将其转换为 JSON。
我的Employee
class如下...
@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]])
我无法理解为什么 "employee" 被认为是 属性。我假设只有 class 成员被视为属性是错误的吗?
问题是 JSON 对象 { }
映射到 Java class,JSON 中的属性映射到 Java 属性。您的 JSON 中的第一个 { }
(您正试图解组为 Employee
)有一个 属性 employee
,其中 Employee
class 没有 属性。这就是你收到错误的原因。如果您要尝试仅解组随附的 { }
{
"id": "c1654935-2602-4a0d-ad0f-ca1d514a8a5d",
"name": "smith"
}
它会起作用,因为 Employee
具有这些属性。如果您无法控制 JSON,那么您可以配置 ObjectMapper
来解包根值
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
但是您可能还有另一个问题。展开基于 Employee
class 上的注释,@JsonRootName("employee")
或 @XmlRootElement(name = "employee")
。但是对于后者,您需要确保具有 JAXB 注释支持。为此,您需要 jackson-module-jaxb-annotations,然后注册模块
mapper.registerModule(new JaxbAnnotationModule());
这适用于您正在使用的所有 JAXB 注释。没有这个模块,它们将无法工作。
@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));