Grails отображает кодировку AsJSON GORM с помощью ObjectId (mongodb) - PullRequest
1 голос
/ 03 марта 2011

Вот модель

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))] 
}

Ответы [ 5 ]

3 голосов
/ 18 сентября 2013

Зарегистрируйте этот объект Marshler на Bootstarp.groovy, и он будет работать как брелок

import grails.converters.JSON
import org.bson.types.ObjectId

JSON.registerObjectMarshaller(ObjectId) {
        return it.toStringMongod()
}
0 голосов
/ 28 ноября 2013

Просто определите класс своего домена как

class Foo {  
  String id  
  String name 

}

Вместо ObjectId

0 голосов
/ 07 марта 2012

Используйте GStrings на вашей карте, и вы получите числовое значение для вашего ObjectId. Э.Г.

render ["foo":"$foo.id"] as JSON
0 голосов
/ 06 апреля 2012

Вы тоже можете сделать это:

def domainObj = YourDomainClass.get(params.id)

Map props = [:]
def domain = new DefaultGrailsDomainClass(YourDomainClass.class)
domain.properties.each{
    props[it.name] = domainObj[it.name]
}

props["id"] = domainObj.id.toString()

render props as JSON

Или еще лучше, сделайте его многоразовым. Поместите это закрытие где-нибудь под рукой:

def mongoObjectResponse = {dobj ->

    Map props = [:]
    def domain = new DefaultGrailsDomainClass(YourDomainClass.class)
    domain.properties.each{
        props[it.name] = dobj[it.name]
    }

    props["id"] = dobj.id.toString()

    // I like to leave room in my responses for messages and such
    message = ""
    obj = props
}

Тогда позвоните так со своего контроллера:

return render(contentType: "text/json") {
    mongoObjectResponse.delegate = delegate
    mongoObjectResponse(domainObj)
}
0 голосов
/ 03 марта 2011

Если вы собираетесь JSON-кодировать свои доменные классы в Интернет, мне интересно, не будет ли ObjectId лучшим выбором?Интеграция GORM / MongoDB позволяет использовать любой тип идентификатора.Вы можете просто объявить его как тип String (который может быть назначен как toString ObjectId, если вы хотите использовать его для его случайности), и тогда вам не нужно беспокоиться об этом беспорядке.Любые проблемы с производительностью / масштабируемостью могут быть проанализированы / рассмотрены позже, но я бы не ожидал, что они возникнут, если только это не очень большое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...