Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 杰克逊-必须的财产?_Java_Json_Annotations_Jackson - Fatal编程技术网

Java 杰克逊-必须的财产?

Java 杰克逊-必须的财产?,java,json,annotations,jackson,Java,Json,Annotations,Jackson,我在对象映射器上使用Jackson的readValue()方法读取JSON文件并将其转换为java对象 例如 我可以在MyTargetClass上设置任何注释来强制执行所需的属性吗?例如,如果我有一个属性为ABC、DEF和GHI的JSON对象,那么我的JSON如下 { "ABC" : "somevalue" "DEF" : "someothervalue" } 我希望它以某种方式失败,并且只有在包含ABC、DEF和GHI的readValue上成功 Jackson不包括验证功能,这是设

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

例如

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

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

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

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

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


编辑:我对此投了反对票,没有任何评论。我很想知道为什么,因为它做的事情完全正确。

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

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

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

我发现理解杰克逊的注释很有帮助。它还很好地解释了为什么required=true不够,而且与它的名称背道而驰。

Hello。也许是因为它还不起作用。请参阅:@gunithdavasurendra它在杰克逊的最新版本中确实有效。我使用的是2.7.3,它也有效。然而,我发现有一种情况是不可行的:在使用@JsonDeserialize(builder=Foo.builder.class)时注释构建器方法。我使用的是spring boot 1.5.9.RELEASE,它使用jackson core 2.8.10和jackson annotations 2.8.0,它似乎不起作用。我检查了2.8.0上的源代码,其javadoc说请注意,从2.6开始,此属性仅用于Creator属性,以确保JSON中存在属性值:对于其他属性(使用setter或可变字段注入的属性),不执行验证。今后可能会增加对这些案例的支持。此属性的状态通过内省公开,其值通常由模式生成器使用,例如JSON模式的生成器。“有没有关于如何将
Bean验证API
readValue()一起使用的示例?
please?第一次点击Google“jackson Validation with Bean Validation”?--不在
readValue()中)
,首先阅读(绑定),然后验证。谢谢,经过几个小时的搜索,我最终也在那个链接上结束了。我在谷歌上的第一次点击是这个答案。仅供参考,我发现@JsonCreator在2.9.10.3版中是不必要的。
@JsonCreator
public QuerySettings(@JsonProperty(value = "endPoint", required = true) String endPoint) {
        this.endPoint = endPoint;
}