使用metaClass动态添加属性,如何将其转换为JSON格式

3

我正在尝试为类的每个实例添加动态属性,然后将此类对象的列表转换为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
    }
}

现在我希望这个动态添加的“details”属性也能以JSON格式呈现。请帮忙。
1个回答

1

如果不创建 Setter,只是添加一个属性,它能正常工作吗?

it.metaClass.details = details

如果不是这样的话,你最好的选择可能是从你的authorsList创建一个Map列表(将详细信息键/值对添加到每个Map中),然后对其进行序列化...

谢谢回复,伙计。"it.metaClass.details = details" 确实有效,你能否详细说明它将如何帮助? - vijay tyagi
我猜测Grails JSON序列化器是通过迭代对象属性来实现的,而不是迭代所有以'get'开头并返回某些内容的方法。以一个简单的例子(基于字符串)为例,def a ='tim';a.metaClass.prop ='yates';println a.properties.keySet()输出:[prop,class,bytes,empty],所以您可以看到我们的属性在那里。显然,字符串可能被处理为一个单独的情况,因为您不希望将“bytes”和“class”写入您的JSON;-) - tim_yates
为所有对象创建地图,然后手动添加属性看起来非常低效。 - vijay tyagi
我只是在寻找更好的解决方案。谢谢您关注此事。 - vijay tyagi
1
我也遇到了这个问题。可以直接使用net.sf.json.JSONSerializer(我认为Grails在此处使用的是JSON序列化)轻松地复现它。 import net.sf.json.*; def js = new JSONSerializer(); class Thing { def one=1; def two=2; Thing(data) { data.each { k,v -> this.metaClass[k] = v } } } def obj = new Thing([aye:'a', bee:'b', cee:'c']); js.toJSON(obj) 结果:{"one":1,"two":2} 有人解决了吗? - David Pisoni
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接