循环为JSON的Groovy对象

时间:2019-02-06 04:52:04

标签: json groovy

我正在尝试使用默认的Json工具将对象输出为JSON。但不幸的是,所讨论的对象实际上具有循环。我需要JSON来输出#ref或只是修剪它。

我一直在与JsonGenerator一起工作,尝试定义一个自定义转换器,当发现对象已经序列化对象时,它只会停止跟随对象序列化。我不能使用经典的哈希结构,因为这会遇到相同的问题:因此使用IdentityHashMap。因为我基本上是想从詹金斯(Jenkins)导出一个复杂的结构,所以我不敢知道我可以排除哪些字段(实际上,我正在尝试确定哪些字段可用)。

  1. 下面的第一种方法会生成一个NullPointerException,因为它显然不处理空值(这是很普通的情况,没有意义)。
  2. 因此,我将excludeNulls()添加到了构建器中;同样的结果。
  3. 由于我不在乎该键的输出是什么,只要它不产生错误,就可以了。我只是将其硬编码为“ #ref”,这就是我得到的全部!
  4. 然后我想到,如果不是我的情况,我应该将其委托给原始实现。那继续产生堆栈溢出。

如果问题不明显,那就是这样:如何采用下面的地图结构并使其输出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)}

1 个答案:

答案 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)}