【发布时间】:2011-03-03 00:06:54
【问题描述】:
这是一个模型
import org.bson.types.ObjectId
class Foo{
ObjectId id
String name
}
这里是一个动作
def action = {
render(status:200, contentType:"application/json") {
['foo' : Foo.get(params.id)]
}
}
该操作将返回类似这样的内容
{"foo":{"class":"Foo","id":{"class":"org.bson.types.ObjectId","inc":340737392,"machine":-2019394572,"new":false,"time":1299107672000},"name":"fooName"]}
我的问题是,我怎样才能在 json 中发送 ObjectId 的 toString,我不想要这个
"id":{"class":"org.bson.types.ObjectId","inc":340737392,"machine":-2019394572,"new":false,"time":1299107672000}
我想要更多的东西
"id":18893828183
我知道我可以选择我想要的参数:
def foo = Foo.get(params.id)
['foo' : 'Foo' :[id:foo.id.toString(), name:foo.name]]
但我不想总是声明我想要返回为 json 的内容,我想返回所有对象 Foo.get(params.id).encodeAsJSON()...
有没有办法覆盖 encodeAsJSON()
我已经尝试添加这个
class Foo{
....
static transients : ['idStr']
def getIdStr(){
return this.id.toString()
}
....
}
但它在 encodeAsJSON() 中被忽略了
我什至试过这个
class Foo{
....
def toJSON(){
def obj = this.encodeAsJSON()
def json = new JsonSlurper().parseText(obj);
json.idString = this.id.toString()
return json.toString()
}
...
}
这“有效”,但没有....
因为在这之后
render(status:200, contentType:"application/json") {
['foo' : Foo.get(params.id).toJSON()]
}
渲染器对 json 进行编码,所以一切都被“转义”了......
那么您认为解决方案是什么,让构建器始终定义我想要返回的内容?
希望,我已经把我的问题说清楚了......
我将从builder开始,希望您能给我另一个更简单/更清洁的解决方案...
谢谢
编辑 我刚刚做了一个将对象作为地图返回的方法,所以现在我做了这样的事情
render(status:200, contentType:"application/json") {
['foo' : getFooAsMap(Foo.get(params.id))]
}
【问题讨论】:
-
我刚刚做了一个将对象作为地图返回的方法,所以现在我做了类似这样的事情 render(status:200, contentType:"application/json") { ['foo' : getFooAsMap(Foo .get(params.id))] }
标签: json serialization grails mongodb