9

次のドメイン モデルの場合:

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


    static mapping = {
        checkPoints lazy: false
    }
}

Route特定のものを Web サービスから JSON として返す必要があります。そして、この JSON にすべてを含め、checkPoints他のコンポジション (つまり: someBigObject) を含めないようにします。

私が行った場合

def route = Route.findById(id)
render route as JSON

私が得たのはの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
    }
}

しかし、私がそうするなら

JSON.use('deep') {
    render route as JSON
}

私はすべてを手に入れます。つまり、ほとんどすべてのデータベースがさまざまな関係を通じて取得されています。

jsonMaps を手動で作成せずにこれを行う方法はありますか?

4

1 に答える 1

15

選択したクラスに独自の JSON マーシャラーを登録し、レンダリングするプロパティを返すことができます。マップは、クラス フィールドの反復によって自動的に実行できます。マーシャラーは、作成時にブートストラップまたはドメイン クラスなどに登録できます。

JSON.registerObjectMarshaller(Route) {
    return [name:it.name, checkPoints:it.checkPoints]
}

それについての素晴らしい記事があります: http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/

それが役に立てば幸い

于 2013-01-31T12:49:38.383 に答える