Groovy JsonOutput/JsonBuilder 可验证问题

Groovy JsonOutput/JsonBuilder issue with Validatable

正在尝试为从特征 grails.validation.Validateable 继承的 class 的简单对象获取 JsonOutput.toJson(obj) 结果:

    class Test implements Validateable{
        Long id 
    }

并抛出 Whosebug 异常。

而对于以下纯 class 对象:

    class TestSimple {
        Long id 
    }

一切正常。

也用JsonBuilder测试了这个,结果是一样的。有什么办法解决这个问题吗?

似乎 Validateable 特性添加的某些属性在序列化为 json 时会导致递归调用链。我这里没有完整的根本原因分析,但在 groovy >= 2.5.0 中你可以执行以下操作:

import grails.validation.*
import groovy.json.*


class Abcdefg implements Validateable {
}

def a = new Abcdefg()

/* 
properties returned by DefaultGroovyMethods.getProperties(a):
  contentHash -> 25e8e25d2e2db8d4c1c300b2dbc5b75c
  originalClassName -> Abcdefg
  class -> class Abcdefg
  errors -> grails.validation.ValidationErrors: 0 errors
  constraintsMap -> [contentHash:grails.validation.ConstrainedDelegate@75561c4c, originalClassName:grails.validation.ConstrainedDelegate@771ff7d2]
*/
def generator = new groovy.json.JsonGenerator.Options()
    .excludeFieldsByName('errors', 'constraintsMap')
    .build()

def json = generator.toJson(a)

println(json)

从 json 序列化中排除 errorsconstraintsMap 属性并删除 WhosebugException。

假设您不需要特别序列化 errorsconstraintsMap 这可能是一个选项。

如果你这样做,你将不得不更深入地挖掘并理解为什么会发生这种情况。