2012-04-19 4 views
2

クラスの各インスタンスに動的プロパティを追加し、そのオブジェクトのリストをjsonに変換しようとしています。(metaClassを使用して)動的に追加されたプロパティをJSONに変換する方法

class Author{ 
    String name 
    static hasMany=[books:Book] 
} 

class Book{ 
    String title 
    static belongsTo=[author:Author] 
} 

my controller 

class AuthorController{ 
    def listAuthors={ 
     def authorsList=Author.list() 
     def details=['address':'xyz', phone:'123'] 
     authorList.each{ 
      it.metaClass.getDetails={->details} 
     } 

     render authorsList as JSON 
    } 
} 

以下の例を参照してください。今、私はまた、JSONとしてレンダリング取得するには、この動的に追加「詳細」プロパティをしたいです。追加(ない場合は

it.metaClass.details = details 

、あなたの最高のパスがあなたのauthorsListから地図のリストを作成するには、おそらくです:代わりにセッターを作成することが動作します、あなただけのようにプロパティを追加する場合

答えて

1

助けてください詳細はキー/値ペアを各マップに入力してください)。

+0

「it.metaClass.details = details」が返答してくれてありがとうございます。どうすればそれが助けになるのですか? –

+0

Grails JSONシリアライザは、「get」で始まり何かを返すすべてのメソッドを反復処理するのではなく、オブジェクトプロパティを反復処理すると思います。 (Stringに基づく)簡単な例として、 'def a = 'tim'; a.metaClass.prop = 'yates'; println a.properties.keySet() 'は印刷します:' [prop、class、bytes、empty] 'ですので、私たちのプロパティがそこにあることがわかります。明らかにStringはあなたが 'bytes'と' class'があなたのjsonに書き込まれることを望まないので別のケースとして扱われます;-) –

+0

私はあなたの提案した方法(it.metaClass.details = details)で試しましたが失敗しますこの例外はjava.lang.IllegalAccessException:org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshallerクラスはorg.codehaus.groovy.runtime.metaclass.ThreadManagedMetaBeanPropertyクラスのメンバーにアクセスできません。$ ThreadBoundGetter修飾子付き"public" ' –

関連する問題