我在对象映射器上使用Jackson的readValue()方法从JSON文件中读取并将其转换为我的java对象。
例如
mapperObject.readValue( node, MyTargetClass.class )
我是否可以在MyTargetClass上设置任何注释来强制执行必需的属性?例如,如果我有一个带有属性ABC,DEF和GHI的JSON对象,我的Json就是以下
{
"ABC" : "somevalue"
"DEF" : "someothervalue"
}
我希望它以某种方式失败,只有在包含ABC,DEF和GHI的readValue上才能成功。
答案 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)