这是一个模型
import org.bson.types.ObjectId
class Foo{
ObjectId id
String name
}
这是一个 Action
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进行编码,因此所有内容都被“转义了”。
那么您认为解决方案是什么,而构建器总是定义我要返回的内容?
希望,我已经明确了我的问题...。
我将从构建器开始,希望您能给我另一个更简单/更简洁的解决方案...
谢谢
编辑
我只是做了一个将对象作为 map 返回的方法,所以现在我做了这样的事情
render(status:200, contentType:"application/json") {
['foo' : getFooAsMap(Foo.get(params.id))]
}
最佳答案
在Bootstrap.groovy上注册此对象Marshaller,它将像吊饰
import grails.converters.JSON
import org.bson.types.ObjectId
JSON.registerObjectMarshaller(ObjectId) {
return it.toStringMongod()
}
一样工作
关于json - Grails使用ObjectId(MongoDB)渲染encodeAsJSON GORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175068/