2013-02-05 83 views
0

当从Groovy 1.8.4升级到1.8.5时,JsonSlurper返回一个BigDecimal而不是float或double来表示Json中的数字。例如,考虑下面的JSON文件:我可以使用Groovy中的ExpandoMetaClasses执行此操作吗?

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

在Groovy 1.8.4“年龄”,而在Groovy 1.8.5+它表示为一个BigDecimal将被表示为浮动。我创建了一个Java framework,它使用Groovy JsonSlurper,以便保持向后兼容性,我希望将JSON数字(如33.4)转换为float或double透明。查看了groovy-json源代码后,我看到JsonSluper使用了一个JsonToken,它在“getValue()”方法中创建了一个33.4的BigDecimal。该方法由JsonSlurper实例调用。

所以我想要做的是重写JsonToken类中的getValue()方法,让它返回一个float或double。这是我已经试过:

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(..)前执行重写“的getValue()”中JsonToken不叫(原来的getValue()方法被调用代替)。但是如果我将JsonSlurper类中的所有代码复制到我自己的类中,我们称之为JsonSlurper2,并调用new JsonSluper2().parseText(..)调用“getValue()”的重写方法,并且所有代码都按预期工作。为什么是这样?为了避免将JsonSlurper复制到我自己的类中,我需要做些什么?

回答

相关问题