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
から地図のリストを作成するには、おそらくです:代わりにセッターを作成することが動作します、あなただけのようにプロパティを追加する場合
「it.metaClass.details = details」が返答してくれてありがとうございます。どうすればそれが助けになるのですか? –
Grails JSONシリアライザは、「get」で始まり何かを返すすべてのメソッドを反復処理するのではなく、オブジェクトプロパティを反復処理すると思います。 (Stringに基づく)簡単な例として、 'def a = 'tim'; a.metaClass.prop = 'yates'; println a.properties.keySet() 'は印刷します:' [prop、class、bytes、empty] 'ですので、私たちのプロパティがそこにあることがわかります。明らかにStringはあなたが 'bytes'と' class'があなたのjsonに書き込まれることを望まないので別のケースとして扱われます;-) –
私はあなたの提案した方法(it.metaClass.details = details)で試しましたが失敗しますこの例外はjava.lang.IllegalAccessException:org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshallerクラスはorg.codehaus.groovy.runtime.metaclass.ThreadManagedMetaBeanPropertyクラスのメンバーにアクセスできません。$ ThreadBoundGetter修飾子付き"public" ' –