【问题标题】:UnrecognizedPropertyException: Unrecognized field "sections"UnrecognizedPropertyException:无法识别的字段“部分”
【发布时间】: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)添加到类吗?

标签: java json jackson


【解决方案1】:

看起来 JSON 本身在一个或多个 dataBlock.sections 项中有另一个 sections 字段。如果您无法控制 JSON 对象的构造,则需要在 SectionObject 类上添加 @JsonIgnoreProperties 注释,以便当 JSON 对象具有 POJO 中未指定的字段时,它在反序列化过程中不会抛出错误。

@JsonIgnoreProperties(ignoreUnknown = true)
public class SectionObject {
    // class members and methods here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2021-06-30
    • 2016-04-13
    • 2016-01-26
    相关资源
    最近更新 更多