6

我试图弄清楚如何将 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 提供的所有功能的解决方法。

4

2 回答 2

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

于 2013-09-05T08:14:06.960 回答
1

我从来没有让它在 Grails 2.1.1 下工作,但显然这是在Grails 2.3中修复的,

将请求正文绑定到命令对象 如果对接受命令对象的控制器操作发出请求并且请求包含正文,则正文将被解析并用于对命令对象进行数据绑定。这简化了请求包含可以绑定到命令对象的 JSON 或 XML 主体(例如)的用例。有关更多详细信息,请参阅命令对象文档。

于 2013-11-23T02:22:38.060 回答