0

当从 Groovy 1.8.4 升级到 1.8.5 时,JsonSlurper 返回 BigDecimal 而不是 Json 中数字的浮点数或双精度数。例如,考虑以下 JSON 文档:

{"person":{"name":"Guillaume","age":33.4,"pets":["dog","cat"]}} 

在 Groovy 1.8.4 中,“年龄”将表示为浮点数,而在 Groovy 1.8.5+ 中,它表示为 BigDecimal。我创建了一个在底层使用 Groovy JsonSlurper 的Java 框架,因此为了保持向后兼容性,我想将 JSON 数字(例如 33.4)透明地转换为浮点数或双精度数。在查看了 groovy-json 源代码后,我看到 JsonSluper 使用了 JsonToken,它在其“getValue()”方法中创建了 33.4 的 BigDecimal。此方法由 JsonSlurper 实例调用。

所以(我认为)我想做的是重写 JsonToken 类中的 getValue() 方法,让它返回一个浮点数或双精度数。这是我尝试过的:

    def original = JsonToken.metaClass.getMetaMethod("getValue")
    JsonToken.metaClass.getValue = {->
        def result = original.invoke(delegate)

        // Convert big decimal to float or double
        if (result instanceof BigDecimal) {
            if (result > Float.MAX_VALUE) {
                result = result.doubleValue();
            } else {
                result = result.floatValue();
            }
        }
        result
    }

问题是,即使new JsonSluper().parseText(..)在不调用 JsonToken 中覆盖的“getValue()”之前执行了上述代码(而是调用了原始的 getValue() 方法)。但是,如果我将 JsonSlurper 类中的所有代码复制到我自己的类中,我们称之为 JsonSlurper2,并调用new JsonSluper2().parseText(..)“getValue()”的覆盖方法,一切都按预期工作。为什么是这样?我应该怎么做才能避免将 JsonSlurper 复制到我自己的班级?

4

1 回答 1

1

JsonSlurper是一个 Java 类,因此您无法通过metaClass. 请参阅此邮件列表线程

这个问题看起来可能有办法让你做到这一点。

于 2013-02-05T20:48:58.733 回答