具有嵌套对象的对象的完整 JSON 渲染

Posted

技术标签:

【中文标题】具有嵌套对象的对象的完整 JSON 渲染【英文标题】:Full JSON render of object with nested object 【发布时间】:2012-06-28 19:04:26 【问题描述】:

我有一个带有 mongodb 插件的 grails 应用程序。

我所有的域对象都是:

class Person 
  ObjectId id
  String name

class Like 
  ObjectId id
  Person from
  Person to
  Date createdAt

我的控制器应该根据一些Like by 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"
  

我的问题是:有没有办法构造完整的(带有引用的对象) mongo db (DBObject) 数据对象的 JSON?我发现这个solution with JSONBuiled 带有转义字段'class'、metaClass' 和'dbo'。但我认为它可以用 Expando 类来完成,但我找不到正确的方法......

谢谢你, 马克西姆

【问题讨论】:

【参考方案1】:

改变

render(like as grails.converters.JSON)

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

【讨论】:

我试过这种方式,但响应是 "class":"Like", "id":..., "createdAt":"2012-06-22T11:05 :15Z", "from": "class":"Person", "id":..., "name":null , "to": "class":"Person", "id" :..., "name":null 所以深度配置不会触发惰性方法。 deep.JSON 现在已弃用。使用 JSON.use("deep") 进行深度转换。【参考方案2】:

我相信标准方法是现在使用命名配置,所以你想要

JSON.use("deep") 
    render like as JSON

【讨论】:

我试过这种方式,但响应是` "class":"Like", "id":..., "createdAt":"2012-06-22T11: 05:15Z", "from": "class":"Person", "id":..., "name":null , "to": "class":"Person", "id ":..., "name":null ` 所以深度配置不会触发惰性方法。【参考方案3】:

如果这仍然是您的问题,您可能想尝试另一个 JSON 库,例如 Jackson,它比 Grails JSON 库可以更好地控制将对象序列化为 JSON。

【讨论】:

嗨!我围绕我的班级写了一个定制的作品。我知道这对我不好)。下次我会使用你的建议,我想。无论如何谢谢你!【参考方案4】:

将子关联设置为非惰性。 所以

   class Like 
  ObjectId id
  Person from
  Person to
  Date createdAt



 static mapping = 
        from lazy: false
    


【讨论】:

unlazy 配置不太适合我...但可以提供帮助。谢谢! 永远不要那样做,想象你有很多嵌套对象,你只想改变一个属性,你会在内存中加载所有对象,嵌套对象,子嵌套对象在嵌套对象等中。

以上是关于具有嵌套对象的对象的完整 JSON 渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 的 API 中渲染嵌套在对象中的数组中的数据?

React 中数组嵌套怎么渲染数据

在渲染之前重新安排对象上的 CakePHP JSON 响应

React 渲染嵌套对象,内部对象会是undefined

React 如何在嵌套数据对象中渲染动态图像

如何迭代嵌套对象并在 jsx 中渲染?