使用spring mvc验证JSON列表作为根对象

时间:2014-06-23 17:00:13

标签: json validation spring-mvc bean-validation

我需要验证类似于以下内容的JSON列表:

[{"op":"A","path":"C","value":"B"},...]
在Spring MVC应用程序中的

- 我目前正在将(使用默认的Jackson)反序列化为一个对象:

public class Operations extends ArrayList<Operation>{}
public class Operation {
     @NotEmpty
     public String op;
     @NotEmpty
     public String path;
     public Object value;

     public void setOp(String op)... and other getters/setters

}

但我无法弄清楚如何通过引用hibernate实现提供的jsr303验证来触发Operation的属性。

如果我将列表包装在一个类中但是我的JSON格式不正确,我可以使它起作用,例如:

{"ops":[{"op":"A",...},...]}

是否可以验证第一个对象(操作)?如果没有,可以将第一种格式(即JSON列表)序列化为第二种格式的对象(即包含在具有占位符字段的占位符对象中的列表)

更新 由于未能找到在裸ArrayList上触发jsr303验证的方法,我编写了一个自定义的jackson json反序列化器,将其粘贴到一个包含对象的内容中,带有带注释字段的

@JsonDeserialize(using=OperationsDeserializer.class)
public class Operations {
    @NotEmpty
    private ArrayList<Operation> ops;
    public void setOps(ArrayList<Operation>ops)...
    public ArrayList<Operation> getOps()...
}

这有效,但现在我的api的任何自动生成的文档都生成了带有虚拟“ops”字段的json示例 - 即{"ops" : [ ... ] }

所以搜索一个在不是另一个对象的字段的ArrayList上触发jsr303验证的方法仍在继续 - 也许有一种方法可以在运行时注入代理包装类,可能会解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

使用ObjectMapper.class。它有一种方法可以将Json Object转换为Class Object

方法是new ObjectMapper().readValue(String str, Class<T> valueType)

因此,您可以迭代您的Object数组,转换为字符串并将其传递给此方法以获得结果。

所以看起来像,

new ObjectMapper().readValue(object.toString, Operation.class);