我需要验证类似于以下内容的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验证的方法仍在继续 - 也许有一种方法可以在运行时注入代理包装类,可能会解决这个问题吗?
答案 0 :(得分:0)
使用ObjectMapper.class
。它有一种方法可以将Json Object
转换为Class Object
方法是new ObjectMapper().readValue(String str, Class<T> valueType)
因此,您可以迭代您的Object数组,转换为字符串并将其传递给此方法以获得结果。
所以看起来像,
new ObjectMapper().readValue(object.toString, Operation.class);