首页 > 解决方案 > 有没有办法设置 toJson() 的递归深度?

问题描述

这似乎是在 groovy 中漂亮地打印对象的最简单/推荐的方法:

println prettyPrint(toJson(myDumbObject))

但是这样做我经常遇到堆栈溢出,因为 toJson() 在找到递归结构时存在已知问题:https ://user.groovy.codehaus.narkive.com/07vuiZZB/groovy-user-stackoverflowerror-in-jsonoutput

有没有办法告诉 toJson() 在 X 级别后停止?

标签: groovy

解决方案


如果你有 groovy 2.5+ 你可以自己做 toJson

import groovy.json.*
import org.apache.groovy.json.internal.CharBuf

@groovy.transform.CompileStatic
class MyJsonOut extends DefaultJsonGenerator {
    private int nestLimit=32
    private int nest=0
    
    MyJsonOut(JsonGenerator.Options opts = new JsonGenerator.Options()){
        super(opts)
    }
    
    @Override
    protected void writeObject(String key, Object object, CharBuf buffer) {
        nest++
        if(nest>nestLimit)object="<TOO-DEEP>"
        super.writeObject(key, object, buffer)
        nest--
    }
    
    String toPrettyJson(Object o){
        return JsonOutput.prettyPrint(this.toJson(o))
    }
}

class A{
    String name
    def ref
}

def o=new A(name:"hohoho")
o.ref=o
println new MyJsonOut().toPrettyJson(o)

推荐阅读