【发布时间】:2018-04-14 21:25:00
【问题描述】:
我将 Jackson 用作 Spring Boot 应用程序的一部分。我正在将 JSON 转换为 Java,但出现此错误。我做了一些研究,但我仍然不明白出了什么问题或如何解决它。
这是 JSON 片段:
"dataBlock": {
"sections": [
{
"info": "",
"prompt": "",
"name": "First Section",
"sequence": 0,
"fields": [],
"gatingConditions": [],
"guid": "480d160c-c34f-4022-97b0-e8a1f28c49ae",
"id": -2
}
],
"prompt": "",
"id": -1,
"name": ""
}
所以我的这个“dataBlock”元素的Java对象:
public class DataBlockObject {
private int id;
private String prompt;
private String name;
private List<SectionObject> sections;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<SectionObject> getSections() {
return sections;
}
public void setSections(List<SectionObject> sections) {
this.sections = sections;
}
}
Section 对象是这样的:
public class SectionObject {
private int id;
private String name;
private String prompt;
private String info;
private int sequence;
private List<FieldObject> fields;
private List<GatingConditionObject> gatingConditions;
private String guid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public int getSequence() {
return sequence;
}
public void setSequence(int sequence) {
this.sequence = sequence;
}
public List<FieldObject> getFields() {
return fields;
}
public void setFields(List<FieldObject> fields) {
this.fields = fields;
}
public List<GatingConditionObject> getGatingConditions() {
return gatingConditions;
}
public void setGatingConditions(List<GatingConditionObject> gatingConditions) {
this.gatingConditions = gatingConditions;
}
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
}
所以在我看来,Jackson 会创建一个 DataBlockObject,映射明显的元素,并创建一个我已明确标记为 List 命名部分的数组。 -- 就像 JSON 显示的一样。
现在错误是:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "sections" (class com.gridunity.workflow.bean.json.SectionObject), not marked as ignorable (8 known properties: "gatingConditions", "sequence", "prompt", "fields", "id", "info", "guid", "name"])
现在根据那个错误,我的 8 个元素之一似乎应该命名为“部分”-但这不是我的元素之一。我的部分列表显然有问题,但我无法弄清楚它是什么。
有人可以解释为什么会发生这种情况,尤其是我的结构看起来是正确的,以及如何解决这个问题。我在其他帖子上看到过这个:
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
但这似乎非常错误,因为我知道我的所有属性。
【问题讨论】:
-
似乎真正的 JSON 在其部分内有一个名为 section 的字段(即作为 8 个已知属性 gatingConditions、sequance 等的同级。
-
你能把
@JsonProperty("sections")添加到getter,把@JsonIgnoreProperties(ignoreUnknown = true)添加到类吗?