1

我有一个域类树,我想通过深度转换器将其转换为 JSON:

import grails.converters.deep.JSON

deepObject as JSON

在树的某个地方,我在某些字段中有 Double.NaN 值,并且 JSON 解析器抛出异常:

org.apache.commons.lang.UnhandledException: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: org.codehaus.groovy.grails.web.json.JSONException: JSON does not allow non-finite numbers

我该如何处理这种情况?可能会返回一个字符串 ('NaN')。

我尝试重新调整JSONObject.testValidity(Object o)方法,但这是一个 pojo,所以它不起作用。

编辑

我还尝试在 Bootstrap.groovy 中注册一个编组器:

JSON.registerObjectMarshaller(Double) {
    return it == Double.NaN ? 'NaN' : it.toString()
}

但这也行不通。

4

1 回答 1

0

不幸的是,大多数原生值渲染都是硬编码的grails.converters.JSON,不能用registerObjectMarshaller. 一种解决方案是指定 JSON 转换器类并将其value(Object o)方法覆盖为:

import grails.converters.JSON

class MyJSONConverter extends JSON {

    @Override
    public void value(Object o) throws ConverterException {
        if (o instanceof Double && o.NaN)
            o = 'Nan'
        super.value(o);
    }
}

并调用您的自定义实现

import org.grails.web.converters.ConverterUtil
import org.grails.web.servlet.mvc.GrailsWebRequest

MyJSONConverter myJSONConverter = ConverterUtil.createConverter( MyJSONConverter.class, deepObject,  GrailsWebRequest.lookup()?.applicationContext);
String deepString = myJSONConverter as String;
于 2022-01-30T13:43:31.230 回答