我正在尝试使用默认的Json工具将对象输出为JSON。但不幸的是,所讨论的对象实际上具有循环。我需要JSON来输出#ref
或只是修剪它。
我一直在与JsonGenerator一起工作,尝试定义一个自定义转换器,当发现对象已经序列化对象时,它只会停止跟随对象序列化。我不能使用经典的哈希结构,因为这会遇到相同的问题:因此使用IdentityHashMap
。因为我基本上是想从詹金斯(Jenkins)导出一个复杂的结构,所以我不敢知道我可以排除哪些字段(实际上,我正在尝试确定哪些字段可用)。
NullPointerException
,因为它显然不处理空值(这是很普通的情况,没有意义)。 excludeNulls()
添加到了构建器中;同样的结果。 如果问题不明显,那就是这样:如何采用下面的地图结构并使其输出JSON ;修剪周期(如果需要),但我并不在乎。
import groovy.json.JsonGenerator
import groovy.json.JsonGenerator.Converter
def loop = [
loop: [:]
]
def thing = [
foo:'hello',
baz: [
bat:loop
]
]
loop.loop = thing
new JsonGenerator.Options().addConverter(new Converter() {
private seen = [:] as IdentityHashMap
@Override
boolean handles(Class<?> aClass) {
true
}
@Override
Object convert(Object o, String s) {
if(! (seen[o]) && o){
seen[o] = 'seen + o'
o
}
}
}).build().toJson(thing).with { println(it)}
答案 0 :(得分:1)
似乎JsonGenerator
抛出了NPE
当Converter.convert(v,key)
对原始非null值返回null时...
import groovy.json.JsonGenerator
import groovy.json.JsonGenerator.Converter
def loop = [
loop: [:]
]
def thing = [
foo:'hello',
baz: [
bat:loop
],
nnn: null
]
loop.loop = thing
new JsonGenerator.Options().addConverter(new Converter() {
private seen = [:] as IdentityHashMap
@Override
boolean handles(Class<?> aClass) {
true
}
@Override
Object convert(Object o, String key) {
if(o!=null){
if( seen[o] ){
//o = null //null instead of '<seen>' throws NPE
o = '<seen>'
}else{
seen.put(o,true)
}
}
return o
}
}).build().toJson(thing).with { println(it)}