com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段

新手上路,请多包涵

我有一个反序列化问题:

这是我的课:

 public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    }
}

我要反序列化的 JSON 是:

 {"ResObj":{"ClientNum":"12345","ServerNum":"78945","IdNum":"020252"},"ResInt":0}

我得到这个例外:

 Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ResObj" , not marked as ignorable (0 known properties: ])
 at [Source: java.io.StringReader@1f758500; line: 1, column: 20] (through reference chain: ["ResObj"])

我不想添加:

 @JsonIgnoreProperties(ignoreUnknown = true)

因为我想得到 ResObj…

如果我添加注释,它会通过但它会将其设置为 null .. 我不想要的。

原文由 user2212726 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
2 个回答

如果你不想在你的bean中有一个setter并且只使用字段和getters,你可以使用 ObjectMapper 的可见性检查器—来允许字段可见性。

像下面这样的东西:

 ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));

原文由 Jay 发布,翻译遵循 CC BY-SA 4.0 许可协议

您需要 Setter 方法来允许 Jackson 设置属性,并且您需要将 json 中的字段更改为以小写字母开头:

 public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public void setResObj(Object ResObj) {
        this.ResObj = ResObj;
    }

    // ...
}

和:

 {"resObj":{"clientNum":"12345","serverNum":"78945","idNum":"020252"},"resInt":0}

JSON 更改的原因是 Jackson bean 序列化将反映在类上,当它看到 getXyz() 和 setXyz() 方法时会将它们映射到 Json 文件名称“xyz”(而不是“Xyz”)。

我认为有几种方法可以覆盖此行为,一种是使用 Jackson 注释之一。

原文由 jon-hanson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题