【问题标题】:Full JSON render of object with nested object具有嵌套对象的对象的完整 JSON 渲染
【发布时间】: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 类来完成,但我找不到正确的方法......

谢谢你, 马克西姆

【问题讨论】:

    标签: json mongodb grails


    【解决方案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 配置不太适合我...但可以提供帮助。谢谢!
    • 永远不要那样做,想象你有很多嵌套对象,你只想改变一个属性,你会在内存中加载所有对象,嵌套对象,子嵌套对象在嵌套对象等中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多