grails:2.4.x
IDE:Intellij IDEA 13.x
grails的Domain对象之间如果存在环形引用,直接使用as JSON只会输出关联对象的id,并且如果使用deep也会报错且deep并不支持层级输出设置。达不到一些程序的使用需求。
所以自己在网上翻了很多资料,最终测试出一个比较简单可靠的方案:
1、在config.groovy中添加一句针对JSON转换的配置
grails.converters.default.circular.reference.behaviour = "INSERT_NULL"根据官方文档描述grails的converters类在转换JSON或XML时默认是输出所有环型引用的对象,所以这里要把它改成“INSERT_NULL”,就是如果碰到环型引用,就输出NULL
2、对象转换及自定义字段代码:
JSON.use("deep") //关键,一定要有 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 json3、其实还可以用JSON.registerObjectMarshaller来写自己的JSON构造方法,但是这个方法使用不太方便,所以暂不推荐,只有想用grails的JSON去转换其它框架里的对象时可能会用到(比如activiti框架的Entity对象)。