Вот модель
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 toString ObjectId, я не хочу это
"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, так что все "экранировано" ....
Как вы думаете, какое решение, когда строитель всегда определяет, что я хочу вернуть?
Надеюсь, я прояснил свой вопрос ....
Я начну со строителя, надеюсь, вы можете дать мне другое более простое / понятное решение ...
Спасибо
редактировать
Я только что сделал метод, который возвращает объект в виде карты, так что теперь я делаю что-то вроде этого
render(status:200, contentType:"application/json") {
['foo' : getFooAsMap(Foo.get(params.id))]
}