创建硬编码的json很容易,例如。
String createJson(Person person, list<Account> accounts) {
def builder = new JsonBuilder()
def json = builder {
person person
accounts accounts
}
return builder.toPrettyString()
}
上述工作,并产生这样的东西:
{
"person":{
username": "user"
"firstName": "test"
}
"accounts":[
{
"balance": "200829.00",
"currency": "CRD",
"id": 1,
}
]
}
问题是我们有一个REST api,它返回JSON。当然,我们有很多重复的代码,因为我们无法找到生成JSON api响应的不同部分的通用方法,并将它们组合在一起并通过合并json字符串或通过动态地建立结果来呈现结果。来自地图的json,例如以下不起作用:
String createJson(Map map) {
def builder = new JsonBuilder()
def root = builder {
map.collect { key, value ->
"$key" value
}
}
return builder.toPrettyString()
}
然后这样称呼它:
Person person = someMethodToGetAPerson()
List<Account> accounts = someMethodToGetAccounts(person)
Map map = ["person", person, "accounts", accounts]
String json = createJson(map)
render(status: 200, contentType: 'application/json', text: json)
但是,这会失败,因为grails内容堆栈溢出。
此外,我们已经定义了几个必须使用的json marshallers,例如
JSON.registerObjectMarshaller(Account) {
return [balance: formatter.format(it.balance)....
}
有什么想法吗?
答案 0 :(得分:3)
我能理解的是您想将地图转换为JSON字符串。为此,您可以使用grails.converters.JSON
课程。例如
Person person = someMethodToGetAPerson()
List<Account> accounts = someMethodToGetAccounts(person)
Map map = [person: person, accounts: accounts]
String json = new JSON(map).toString()
toString()
方法也需要boolean
值进行预先打印。它应该尊重你的注册marshallers