杰克逊 - 需要财产吗?

问题描述 投票:0回答:4

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

例如。

mapperObject.readValue( node, MyTargetClass.class )

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

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

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

java json annotations jackson
4个回答
27
投票

您可以使用

@JsonProperty(required = true)
注解根据需要标记属性,如果该属性丢失或
JsonMappingException
,则在反序列化期间会抛出
null


24
投票

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


9
投票

如果要确保提供 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 是不够的,并且与其名称相反。


1
投票

如果您对使用

@JsonProperty(required = true)
不满意,因为它只能与
@JsonCreator
配合使用,也不满意使用 bean 验证,那么解决这个问题的另一种方法是在相关变量的 setter 方法中捕获此问题。

您可以在设置变量之前简单地检查变量是否为空,然后抛出

IllegalArgumentException
NullPointerException
(少数人更喜欢)

注意:这也取决于您的 POJO 的定义方式,因此请确保它采用 setter 方法路线才能使该解决方案发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.