gpt4 book ai didi

json - Grails使用ObjectId(MongoDB)渲染encodeAsJSON GORM

转载 作者:行者123 更新时间:2023-12-02 14:21:31 26 4
gpt4 key购买 nike

这是一个模型

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com