如何使用 JSON-B 拒绝对无法识别的属性进行反序列化

And*_*ert 6 jsonb-api jakarta-ee

我正在尝试迁移某些 JSON 数据绑定代码的实现细节,以使用 Java EE 8 JSON-B API 而不是 Jackson。

为了匹配 Jackson 的默认行为,当 JSON 负载包含无法识别的属性时,我想拒绝将 JSON 负载反序列化为 POJO 的任何尝试。

例如,如果我有以下 JSON 数据:

{ 
  "name": "Bob",
  "extraProp": "Something"
}
Run Code Online (Sandbox Code Playgroud)

我有以下 Java 对象可以将此数据建模为:

public class Thing {
    public String name;
    // no mention of "extraProp"
}
Run Code Online (Sandbox Code Playgroud)

我如何拒绝将上述 JSON 数据绑定到上述 POJO 的尝试?

如果我尝试以下操作,则Thing创建的对象不会出错(这里我希望发生错误):

Jsonb jsonb = JsonbProvider.provider()
                    .create()
                    .build();
Thing t = jsonb.fromJson("{\"name\":\"Bob\",\"extraProp\":\"Something\"}", Thing .class);
Run Code Online (Sandbox Code Playgroud)

小智 7

不幸的是,据我所知,JSON-B 规范不允许这样做。

第 3.18 节说

当反序列化期间的 JSON 绑定实现遇到它无法识别的键/值对中的键时,它应该将 JSON 文档的其余部分视为该元素根本没有出现,特别是,实现不得将其视为错误健康)状况。

但是,参考实现似乎支持名为“jsonb.fail-on-unknown-properties”的属性,您可以设置该属性来启用它。另一个实现 Johnzon似乎,但它没有记录(还没有?)。它的属性被命名为“johnzon.fail-on-unknown-properties”。