2012-06-27 49 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