杰克逊 - 必需的财产?

时间:2012-12-07 03:38:26

标签: java json annotations jackson

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

例如

mapperObject.readValue( node, MyTargetClass.class )

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

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

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

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:12)

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

编辑:我收到了一个没有评论的下注。我很想知道为什么,因为它确实做对了。

答案 2 :(得分:0)

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

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

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

我发现this link对理解Jackson注释很有帮助。这也很好地解释了为什么required = true不够,而且与它的名称背道而驰。

答案 3 :(得分:-4)

可能是Google的GSON库会更好地满足您的需求。但它有相反的要求:你应该严格定义所有结构。