【问题标题】:ObjectMapper deserializing required fields [duplicate]ObjectMapper反序列化必填字段[重复]
【发布时间】:2016-06-29 11:42:10
【问题描述】:

假设我有这样的 json,我想将它反序列化为一个名为 SubscriberProfile 的对象。

{ "field1": "value1", "field2": "value2", "field3": "value3" }

当我使用以下代码时,它可以正常工作,

objectMapper.readValue(json,SubscriberProfile.class);

但如果 json 中缺少 field2(可能缺少 field1 和 field2),我希望 objectmapper 抛出和异常。

所以这样的json应该抛出异常

{ "field1": "value1", "field3": "value3" }

我尝试使用@JsonProperty(required=true) 注释,但仅在序列化时有效。

你知道我该如何解决这个问题吗?

提前致谢

【问题讨论】:

  • 简而言之; jackson 不验证反序列化 - 您需要在反序列化后验证对象,例如使用 hibernate-validator(JSR-303 的参考实现)

标签: java json jackson deserialization objectmapper


【解决方案1】:

您需要删除 bean 类的默认构造函数。这就是让杰克逊在没有您必填字段的情况下创建 bean 的原因。例如(修改自here):

public class NonDefaultBean {
    private final String myRequired;
    private String myNotRequired;

    @JsonCreator
    public NonDefaultBean(@JsonProperty("myRequired") String myRequired) {
        this.myRequired = myRequired;
    }

    public void setMyNotRequired(String myNotRequired) {
        this.myNotRequired = myNotRequired;
    }
}

【讨论】:

  • 我原以为@JsonProperty 上的required=false 会产生相同的效果,但事实并非如此。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多