2013-10-02 11 views
24

私は2つのドメインクラスを持ち、1つは親クラスで、もう1つは子であり、それらの間にhasMany関係があります。親クラスには多くの子があり、子クラスは親クラスに属します。 ここにコード例があります。Grailsは子ドメインオブジェクトを取得します

親オブジェクトを取得するとすぐに問題が発生し、親クラスに関連付けられた子オブジェクトもフェッチされます。しかし、オブジェクトを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"} 
      ] 
}] 

すべてのヘルプを次のように私は、あまりにも子オブジェクトの名前が含まれている応答をしたいです。 ありがとうございます。

答えて

48

問題は、デフォルトの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を使用してグローバルディープコンバーターを設定することですが、この影響はアプリケーションのすべてのドメインクラスに適用されます。これは、トップレベルのオブジェクトに大規模なアソシエーションのツリーがあり、そのトップレベルのオブジェクトのリストを変換しようとすると、ディープコンバーターはすべてのクエリを実行して、関連付けられているすべてのオブジェクトとその関連オブジェクトを順番。 - データベース全体をワンショットで読み込むことができます :)注意してください。

+0

を感謝し、私は第三の方法を使用JSON.use(「DEAP」){JSONとして親をレンダリング}それはちょうど私が期待通りに働いていました。 – user2823355

+0

ありがとう!これは多くの問題を解決します<3 – Mephiztopheles

+0

あなたはとても歓迎して、幸せなコーディングです。 – dbrin

1

ユーザーdbrinは正しいですが、もう1つのオプションがあります。また、GrailsのGSONプラグインを使用することができます。

https://github.com/robfletcher/grails-gson#readme

JSONデータを扱うときにプラグインはいくつかのより多くの機能が追加されています。

3

最新のgrailsは自動的に深く変換されますが、あなたはおそらく遅延ロードの犠牲者です。

子供はアクセス時に読み込まれないため、JSONコンバーターはJSONに変換できません。 この問題を回避するには、この

静的マッピング= {怠惰チャイルズ:偽}置くことですねえ

関連する問題