【问题标题】:Define required fields in POJO class for JSON mapping在 POJO 类中为 JSON 映射定义必填字段
【发布时间】:2020-04-14 11:15:27
【问题描述】:

我正在使用 ObjectMapper (Jackson) 将我的 API JSON 响应映射到 Java 对象。下面是我的 json 的样子:

[
    {
        firstKey : "value1",
        secondKey : "value2",
        thirdKey : "value3"
    },
    {
        firstKey : "value4",
        secondKey : "value5",
        thirdKey : "value6"
    }
]

必填字段是: 第一键 第二键 第三键

我的一些 JSON 响应可能没有所有这三个必填字段,我希望 Jackson 在反序列化时抛出异常。我应该如何让杰克逊知道必填字段?是否有任何注释,除了 JsonProperty(required = true) 因为这不起作用?

另外,如果一个键有空值,它被接受为默认值,所以我也不能使用@NotNull。例如: [ { 第一键:空, 第二键:“值2”, 三键:“值3” } ] 以上是有效的 JSON,应该在反序列化过程中无任何异常地解析。

【问题讨论】:

标签: java json validation jackson jackson-databind


【解决方案1】:

Jackson 中未实现整体验证功能,因为它被认为超出范围,例如参见 Jackson - Required property?

关于为什么注释 @JsonProperty(required = true) 不适用于字段的一些信息可以在这里找到:Jackson @JsonProperty(required=true) doesn't throw an exception

但是,有一个技巧可能适用于 null 和现有的高值字段值,但如果该字段完全丢失,则会引发异常。创建一个带有注解 @JsonCreator 的构造函数(并且不要创建默认构造函数!),其中使用相同的注解 @JsonProperty(value = "*field_name*", required = true) 并且它会在缺少字段的情况下抛出,例如:

@Getter @Setter
public class KeyHolder {
    private String firstKey;
    private String secondKey;
    private String thirdKey;

    @JsonCreator
    public KeyHolder(
            @JsonProperty(value = "firstKey", required = true) String firstKey,
            @JsonProperty(value = "secondKey", required = true) String secondKey,
            @JsonProperty(value = "thirdKey", required = true) String thirdKey) {
        this.firstKey = firstKey;
        this.secondKey = secondKey;
        this.thirdKey = thirdKey;
    }

}

有了这些,做:

new ObjectMapper().readValue("{ \"firstKey\": \"val1\", \"secondKey\": \"val2\" }"
        , KeyHolder.class);

应该是这样的:

com.fasterxml.jackson.databind.exc.MismatchedInputException:缺少必需的创建者属性“thirdKey”(索引 2)

任何必需的参数也必须是构造函数参数。因此,如果添加了字段fourthKey,则构造函数还需要修复,例如添加:

@JsonProperty(value = "fourthKey", required = true) String fourthKey) {

this.fourthKey = fourthKey;

【讨论】:

  • 我刚刚尝试过,但似乎效果不佳。我在这个类中添加了一个字段,比如说第四个键,它在我的 json 响应中不存在,并且在反序列化时没有抛出异常。
  • @brij 你还为fourthKey添加了必需的构造函数参数?
  • 是的,为了测试这一点,我在模型中添加了一个额外的字段,该字段不存在于 JSON 键中,并且在绑定期间仍然没有抛出异常。
  • @brij 很难说你的代码/环境有什么问题,也许是杰克逊的一些设置,或者你在某处捕获了异常,所以它被抑制了。刚刚编辑了我如何证明它有效的答案。它也可能是你的杰克逊版本,我猜这至少需要 2.6。
  • 有没有办法使用这个解决方案而不必在构造函数中为每个参数指定值?它似乎比 Gson 自定义反序列化更容易,但有点烦人:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多