一尘不染

Grails获取子域对象

json

我有两个域类,一个是父级,另一个是子级,并且它们之间具有hasMany关系。家长班有很多孩子,孩子班属于家长班。这是编码示例。

class Parent{
   String name
    static hasMany = [childs:Child] 
    static constraints = {
   }
}


class Child{
   String name
   static belongsTo = [parent:Parent]
   static constraints={}
}

问题是,一旦获得父对象,与父类关联的子对象也将被获取。但是,当我将对象转换为JSON时,我看不到子对象的全部,我只能看到子对象的ID。我想查看子对象的所有列,而不只是ID。

转换后的JSON响应:

[{"class":"project.Parent","id":1,
  "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]

但是我也想要包含子对象名称的响应,如下

[{"class":"project.Parent","id":1,"name":"name1",
  "childs":[{"class":"Child","id":1,"name":"childname1"},
            {"class":"Review","id":2,"name":"childname2"}
           ]
}]

任何帮助,不胜感激。提前致谢。


阅读 248

收藏
2020-07-27

共1个答案

一尘不染

问题在于使用默认的JSON转换器。这是您的选择:

 1. Default  -  all fields, shallow associations
    a. render blah as JSON

 2. Global deep converter - change all JSON converters to use deep association traversal
    a. grails.converters.json.default.deep = true

 3. Named config marshaller using provided or custom converters
    a. JSON.createNamedConfig('deep'){
        it.registerObjectMarshaller( new DeepDomainClassMarshaller(...) )
    }
    b. JSON.use('deep'){
        render blah as JSON
    }

 4. Custom Class specific closure marshaller 
    a. JSON.registerObjectMarshaller(MyClass){ return map of properties}
    b. render myClassInstance as JSON

 5. Custom controller based closure to generate a map of properties
    a. convert(object){
        return map of properties
    }
    b. render convert(blah) as JSON

您当前正在使用选项1,这是默认选项。

您可以执行的最简单的操作是使用选项2设置全局深度转换器,但是请注意,这会影响应用程序中的所有域类。这意味着,如果您有一个大型关联树结结为一个顶级对象,并且尝试转换这些顶级对象的列表,则深层转换器将执行所有查询以获取所有关联对象及其关联对象。转。-
您可以一次加载整个数据库 :)注意。

2020-07-27