2012-06-27 52 views
3

我有一個使用mongodb插件的grails應用程序。完整的JSON對象與嵌套對象的呈現

我所有的域對象是:

class Person { 
    ObjectId id 
    String name 
} 

class Like { 
    ObjectId id 
    Person from 
    Person to 
    Date createdAt 
} 

我的控制器應根據一些Like通過ID給出一個完整的數據:

class MyController { 
    def like() { 
    def like = Like.findById(new ObjectId("someIdHere")); 
    render(like as grails.converters.JSON) 
    } 
} 

我希望收到一個完整的JSON對象,如:

{ 
    "class":"Like", 
    "id":{ 
    "class":"org.bson.types.ObjectId", 
    "inc":1483542456, 
    "machine":805594765, 
    "new":false, 
    "time":1340363115000, 
    "timeSecond":1340363115 
    }, 
    "createdAt":"2012-06-22T11:05:15Z", 
    "from":{ 
    "class":"Person", 
    "id":{ ... }, 
    "name":"Some name here" 
    }, 
    "to":{ 
    "class":"Person", 
    "id":{ ... }, 
    "name":"Some name here" 
    } 
} 

,但我已經收到對象的第一級屬性:

{ 
    "class":"Like", 
    "id":{ 
    "class":"org.bson.types.ObjectId", 
    "inc":1483542456, 
    "machine":805594765, 
    "new":false, 
    "time":1340363115000, 
    "timeSecond":1340363115 
    }, 
    "createdAt":"2012-06-22T11:05:15Z", 
    "from":{ 
    "class":"Person", 
    "id":"4fd31d453004dc0f010aca51" 
    }, 
    "to":{ 
    "class":"Person", 
    "id":"4fd31d463004dc0f010aca89" 
    } 
} 

我的問題是:有沒有什麼辦法來構建完整的(與被引用的對象)蒙戈DB(DBOBJECT)數據對象的JSON?我發現這個solution with JSONBuiled與逃脫的領域'類',metaClass'和'dbo'。但我認爲它可以使用Expando類來完成,但我上無法找到正確的方式...

感謝任何方式, 馬克西姆

回答

2

變化

render(like as grails.converters.JSON) 

render(like as grails.converters.deep.JSON) 
+0

我已經試過這種方式,但響應 { 「類」: 「像」, 「ID」:{...}, 「createdAt」:「2012-06-22T11:05 :15Z」, 「從」:{ 「類」: 「人」, 「ID」:{...}, 「名」:空 }, 「到」:{ 「類」: 「Person」, 「id」:{...}, 「name」:null } } 所以深層配置不會觸發延遲方法。 – Maksim

+2

deep.JSON現已棄用。使用JSON.use(「深度」)進行深度轉換。 –

0

我相信標準的方法是現在使用命名配置,所以你想

JSON.use("deep") { 
    render like as JSON 
} 
+0

我已經試過這種方式,但回覆是 '{ 「class」:「Like」, 「id」:{...}, 「createdAt」:「2012-06-22T11:05: 15Z「, 」from「:{ 」class「:」Person「, 」id「:{...}, 「名」:空 }, 「到」:{ 「類」: 「人」, 「ID」:{...}, 「名」:空 } }' 所以深層配置不會觸發懶惰的方法。 – Maksim

0

將Child關聯設置爲非懶惰。 所以

class Like { 
    ObjectId id 
    Person from 
    Person to 
    Date createdAt 



static mapping = { 
     from lazy: false 
    } 

} 
+0

不靈活的配置不適合我...但可以幫助。 Thnx! – Maksim

+0

永遠不要這樣做,想象你有很多嵌套對象,並且你只想改變一個屬性,用懶惰的錯誤,你會在內存中加載所有對象,嵌套對象,嵌套對象中的子嵌套對象等。 – luisZavaleta

1

如果這仍然是你的問題,你可能想嘗試其他的JSON庫,像Jackson,這在連載對象JSON比Grails的JSON庫做給更多的控制。

+0

嗨!我已經寫了一個關於我的類的定製工作。我知道這對我不好)。我想,下次我會用你的建議。 任何方式謝謝你! – Maksim