grails Domian对象转JSON去class以及自定义字段的最佳方式

grails:2.4.x

IDE:Intellij IDEA 13.x

grails的Domain对象之间如果存在环形引用,直接使用as JSON只会输出关联对象的id,并且如果使用deep也会报错且deep并不支持层级输出设置。达不到一些程序的使用需求。

所以自己在网上翻了很多资料,最终测试出一个比较简单可靠的方案:

1、在config.groovy中添加一句针对JSON转换的配置

grails.converters.json.default.deep = true  //最好是配合默认使用deep。<span style="color:#ff0000;">注:如果在类中使用JSON.use("deep")时,会导致JSON.registerObjectMarshaller失效,这个不知道算不算Grails的BUG</span>
grails.converters.default.circular.reference.behaviour = "INSERT_NULL"
根据官方文档描述grails的converters类在转换JSON或XML时默认是输出所有环型引用的对象,所以这里要把它改成“INSERT_NULL”,就是如果碰到环型引用,就输出NULL

2、对象转换及自定义字段代码:

                //JSON.use("deep")  //config.groovy里全局设置
                def json = new JSON(ug)
//                json.setIncludes(Org.class,["field1","field2"])   //指定某字段可以用这个方法
                json.setExcludes(Org.class,["class"]) //去除不要的字段
                json.setExcludes(User.class,["class","passwordHash"]) //去除不要的字段
                json.setExcludes(Role.class,["class"]) //去除不要的字段
//                json.prettyPrint = true  //格式化json字符串(可有可无)
//                //如果想要添加其它字段,可以用以下方式
//                JSONObject myjson = new JSONObject()
//                myjson.put("dataList",json)
//                myjson.put("page",1)
//                myjson.put("pageSize",2)
//                myjson.put("pageTotal",3)
//                myjson.put("dataCount",4)
//                myjson.put("searchContent",5)
//                println(myjson)
                render json
3、其实还可以用JSON.registerObjectMarshaller来写自己的JSON构造方法,但是这个方法使用不太方便,所以暂不推荐,只有想用grails的JSON去转换其它框架里的对象时可能会用到(比如activiti框架的Entity对象)。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值