如何在JsonBuilder中使用地图?即如何在grails中创建动态而非静态的Json?

时间:2015-10-01 09:05:52

标签: json grails groovy

创建硬编码的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)....
}

有什么想法吗?

1 个答案:

答案 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