在Groovy / Grails中生成的JSON中插入嵌套项

时间:2012-03-09 01:45:02

标签: json grails groovy

我使用Grails 2.1将JSON渲染为我创建的RestFul API的一部分。 Domain类基于SqlServer表,如下所示:

String firstName
字符串lastName
String officialAddress1
字符串officalAddress2
字符串preferredAddress1
字符串preferredAddress2
 (等等。)。 。 。

返回类似于此的JSON:

{
“firstName”:“乔”,
“lastName”:“希尔”,
“officialAddress1”:“1100 Wob Hill”,
“officialAddress2”:“Apt。#3”,
“preferredAddress1”:“1100 Wobbly Lane。”,
“preferredAddress2”:“公寓3” }

它工作正常,但客户希望我以这种方式嵌套结果:
{
“firstName”:“乔”,
“lastName”:“希尔”,
preferredAddress {
“preferredAddress1”:“1100 Wobbly Lane。”,
“preferredAddress1”:“公寓3” },
官方地址{
“officialAddress1”:“1100 Wob Hill”,
“officialAddress2”:“Apt。#3”
}
}

我的问题是,由于域类和数据库不是以返回这种类型的嵌套结果的方式构造的,我如何在返回的JSON中轻松更改它?我是否必须放弃基于数据库/域对象反刍JSON的方式并进行某种自定义转换?

2 个答案:

答案 0 :(得分:4)

我是这个stackoverflow事情的新手,我希望我不会弄乱它,但我想我知道你需要什么。在你的bootstrap.groovy文件中,你找到“def init = {servletContext - >”行 把它放在那里:

JSON.registerObjectMarshaller(YourDomainName) {
def returnArray = [:]
returnArray['firstName'] = it.firstName
returnArray['lastName'] = it.lastName
returnArray['preferredAddress'] = [it.preferredAddress1 ,it.preferredAddress2]
returnArray['officialAddress'] = [it.officialAddress1 ,it.officialAddress2]
return returnArray
}

现在当你使用带有JSON的渲染时,grails将在bootstrap中查找 按照你的要求渲染域名。

希望这会有所帮助

答案 1 :(得分:1)

发布的答案是正确的。我只是想添加一些细微的变化来获得我需要的确切结果:

谢谢!这样做了。我本来认为它不会完全符合我的需要,但我错了。我稍微改变了语法以获得我需要的结果。

        returnArray['preferredAddress'] = [address1: it.preferredAddress1?.trim(),
            address2: it.preferredAddress2?.trim(),
            address3: it.preferredAddress3?.trim(),
            city: it.preferredCity,
            state: it.preferredState,
            postCode: it.preferredPostCode,
            country: it.preferredCountry
            ]