Grails,从json-string创建具有has-many关系的域对象

时间:2012-07-09 16:10:19

标签: json parsing grails parameters

我正在尝试将grails参数映射解析为Json String,然后返回参数映射。 (用于保存具有约束违规的html表单条目)

只要参数映射中没有hasMany关系,一切都很好。

我正在使用

fc.parameter = params as JSON

将params保存为JSON String。

稍后我正在尝试重建参数映射并用它创建一个新的Domain-Object:

new Foo(JSON.parse(fc.parameter))

只使用1:1的关系(状态),一切都很好。

[states:2, listSize:50, name:TestFilter]

但是当我尝试用多选值(状态)重建一个params-map时,

[states:[1,2], listSize:50, name:TestFilter]

我收到了这个IllegalStateException:

Failed to convert property value of type org.codehaus.groovy.grails.web.json.JSONArray to required type java.util.Set for property states; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [de.gotosec.approve.State] for property states[0]: no matching editors or conversion strategy found

我试图使用它,但没有成功:

JSON.use("deep") {
   new Foo(JSON.parse(fc.parameter))
}

1 个答案:

答案 0 :(得分:0)

您可以使用JsonSlurper而不是grails的converter.JSON,它将JSON对象映射到Groovy Maps。我认为this链接也可能对您有所帮助。

编辑:现在,如果问题是将params映射绑定到您的域,您应该尝试使用bindData()方法,如:

bindData(foo, params)

请注意,只有在控制器内调用bindData时才能直接使用。

在您的情况下似乎正在发生的事情是Grails正在尝试将一个具体类型的List(在JsonSlurper的情况下为ArrayList,在converter.JSON的情况下为JSONArray)绑定到一组属性(这是默认值)一对多关联的数据结构)。我将不得不看看你的代码来确认。但是,正如您所做的那样,替换状态:[1,2]为您的应用程序的方法,尝试另一个测试来确认这个假设。变化:

states:[1,2]

代表

states:[1,2] as Set

如果这确实是问题而且 bindData()无效,请查看this以了解使用对象编组和converter.JSON更难的方法。我不知道你在项目中使用它是否实用,但它确实很好用;)