我使用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的方式并进行某种自定义转换?
答案 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
]