grails中hasMany关系的选择性深度渲染

Bah*_*ğan 8 grails json grails-orm

对于以下域模型:

class Route {
    String  name
    static  hasMany     = [checkPoints:CheckPoint]  
    static  belongsTo   = [someBigObject:SomeBigObject]


    static mapping = {
        checkPoints lazy: false
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要Route从Web服务返回一个特定的JSON.我希望这个JSON包含所有checkPoints但没有其他组合(即:) someBigObject.

如果我做

def route = Route.findById(id)
render route as JSON
Run Code Online (Sandbox Code Playgroud)

我得到的只是id的checkPoints,没有其他字段被提取:

{
    "class": "com.example.Route",
    "id": 1,
    "checkPoints": [
        {
            "class": "CheckPoint",
            "id": 1
        },
        {
            "class": "CheckPoint",
            "id": 2
        },
        {
            "class": "CheckPoint",
            "id": 4
        },
        {
            "class": "CheckPoint",
            "id": 3
        }
    ],
    "someBigObject": {
        "class": "SomeBigObject",
        "id": 2
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我这样做

JSON.use('deep') {
    render route as JSON
}
Run Code Online (Sandbox Code Playgroud)

我得到了一切.我的意思是,几乎所有的数据库都是通过各种关系获取的.

有没有办法在不手动创建jsonMaps的情况下执行此操作?

dro*_*ggo 14

您可以为所选类注册自己的JSON编组器并返回要渲染的属性.可以通过对类字段的迭代自动完成映射.Marshaller可以在创建期间在bootstrap或域类中注册.

JSON.registerObjectMarshaller(Route) {
    return [name:it.name, checkPoints:it.checkPoints]
}
Run Code Online (Sandbox Code Playgroud)

关于它的文章很好:http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/

希望能帮助到你