杰克逊 - 必需的财产?

Ren*_*Ren 18 java json annotations jackson

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

例如.

mapperObject.readValue( node, MyTargetClass.class )
Run Code Online (Sandbox Code Playgroud)

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

{
  "ABC" : "somevalue"
  "DEF" : "someothervalue" 
}
Run Code Online (Sandbox Code Playgroud)

我希望它以某种方式失败,只有在包含ABC,DEF和GHI的readValue上才能成功.

Sta*_*Man 15

杰克逊不包括验证功能,这是设计的(即被认为是超出范围).但通常使用的是Bean Validation API实现.关于这一点的好处是数据格式处理和验证逻辑之间的分离.这就是DropWizard使用的框架; 这就是JAX-RS(如泽西岛)为JAX-RS 2.0提供服务的方向.

  • 谢谢,经过几个小时的搜索,我最终也结束了该链接。我的第一个谷歌点击是这个答案。 (2认同)

pos*_*ist 11

您可以根据需要使用@JsonProperty(required = true)注释标记属性,如果属性缺失或为null,它将在反序列化期间抛出JsonMappingException.

编辑:我收到了一个没有评论的downvote.我很想知道为什么,因为它确实是正确的.

  • 这是不正确的。`@JsonProperty(required = true)` 仅适用于序列化,不适用于反序列化 (3认同)
  • 我正在使用2.7.3,它可以工作。但是,我发现了一种情况却没有:在使用@JsonDeserialize(builder = Foo.Builder.class)时注释生成器方法。 (2认同)

Mem*_*min 6

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

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

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

我发现此链接有助于理解 Jackson 注释。它还很好地解释了为什么 required=true 是不够的,并且与其名称相反。