我正在试图弄清楚如何将JSON请求中的嵌套对象反序列化并验证到Grails 2.1.1命令对象中。
目前我的控制器中有一个命令对象,它有一些基本属性,然后是域对象列表,
protected static class CustomCommand {
String name
String description
List<DomainObject> objs
}
我的POST请求的JSON正文,
{
name: 'test name',
description: 'test description',
objs: [
{
name: 'test sub object',
description: 'test description'
}
]
}
我看到用空数组创建的命令对象。 知道如何在JSON主体中获取子对象以反序列化为命令对象然后验证它们吗?
以前我通过手动创建参数图中的对象并直接验证它来解决这个问题,但这感觉就像是一种没有利用Grails提供的所有功能的解决方法。
答案 0 :(得分:8)
我们遇到了将后期数据绑定到命令中的列表的类似问题。我们的解决方法是为集合元素定义默认值:
class MyCommand {
List<MyClass> items= [].withLazyDefault {
new MyClass()
}
}
之后,帖子数据正确绑定到列表。我认为原因是Groovy忽略了列表的泛型类型参数,并且不知道在运行时实例化哪个对象。
我不确定这是否适用于您的情况,但可能值得一试
<强>更新
几分钟前我用过这个:
public static class MyCommand {
String foo
List<Bar> bars
public String toString() {
return "foo: " + foo + ", bars: " + bars
}
}
public static class Bar {
String baz
}
控制器方法:
def test() {
println new MyCommand(request.JSON)
}
我使用jquery发布了一些json:
$.ajax({
type: "POST",
url: '...',
data: JSON.stringify({
'foo': '12345',
bars: [
{baz: '1'},
{baz: '2'}
]
}),
contentType : 'application/json',
});
控制器打印的输出:
foo: 12345, bars: [[baz:1], [baz:2]]
所以似乎有效:o
答案 1 :(得分:1)
我从来没有在Grails 2.1.1下工作,但显然这已在Grails 2.3修复,
将请求主体绑定到命令对象 如果向接受命令对象的控制器动作发出请求并且请求包括正文,则将解析正文并用于对命令对象进行数据绑定。这简化了请求包含可以绑定到命令对象的JSON或XML主体(例如)的用例。有关更多详细信息,请参阅命令对象文档。