22

我在对象映射器上使用 Jackson 的 readValue() 方法从 JSON 文件中读取并将其转换为我的 java 对象。

例如。

mapperObject.readValue( node, MyTargetClass.class )

我可以在 MyTargetClass 上设置任何注释来强制执行所需的属性吗?例如,如果我有一个带有属性 ABC、DEF 和 GHI 的 JSON 对象,而我的 Json 如下

{
  "ABC" : "somevalue"
  "DEF" : "someothervalue" 
}

我希望它以某种方式失败,并且只有在 readValue 包含 ABC、DEF 和 GHI 时才能成功。

4

4 回答 4

20

您可以使用注解将属性标记为需要,@JsonProperty(required = true)如果该属性丢失或为空,它将在反序列化过程中抛出 JsonMappingException。

编辑:我收到了对此的反对意见,没有发表评论。我很想知道为什么,因为它完全正确。

于 2016-08-24T17:59:41.960 回答
17

Jackson 不包括验证功能,这是设计使然(即被认为超出范围)。但通常使用的是Bean Validation API实现。这样做的好处是数据格式处理和验证逻辑之间的解耦。这就是 DropWizard 之类的框架所使用的;这是 JAX-RS(如 Jersey)为 JAX-RS 2.0 开发的方向。

于 2012-12-07T18:16:12.417 回答
5

如果要确保提供了 json 字段,则必须使用@JsonProperty(value = "fieldName", required = true)注解作为构造函数的参数。但这还不够,构造函数也应该有@JsonCreator注释。

例如,如果您有一个名为 ' endPoint' 的字段,并且您希望确保它在 JSON 文件中提供,那么如果未提供,以下代码将引发异常。

@JsonCreator
public QuerySettings(@JsonProperty(value = "endPoint", required = true) String endPoint) {
        this.endPoint = endPoint;
}

我发现此链接有助于理解 Jackson 注释。它也很好地解释了为什么 required=true 是不够的,而且它的名字有悖于直觉。

于 2019-07-02T14:17:19.493 回答
0

如果您对使用它既不满意也不满意,@JsonProperty(required = true)因为它仅适用于@JsonCreatorbean验证或使用bean验证,那么解决它的另一种方法是在相关变量的setter方法中捕获它。

您可以在设置变量之前简单地检查变量是否为空并抛出IllegalArgumentExceptionNullPointerException(少数人喜欢)

注意:这也取决于您的 POJO 是如何定义的,因此请确保它正在使用 setter 方法路由以使该解决方案起作用。

于 2021-09-23T08:47:33.270 回答