Java GSON exceptions—打印序列化Nan时出错的字段名

Java GSON exceptions—打印序列化Nan时出错的字段名,java,gson,nan,Java,Gson,Nan,我正在使用Gson,序列化对象时遇到问题: java.lang.IllegalArgumentException: NaN is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method. at com.google.gson.Gson.checkVa

我正在使用Gson,序列化对象时遇到问题:

java.lang.IllegalArgumentException: NaN is not a valid double
    value as per JSON specification. To override this behavior, 
    use GsonBuilder.serializeSpecialFloatingPointValues() method.
    at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:296)
    ...
有没有办法让Gson打印出它遇到问题的类名/字段名?我可以按照建议使用
serializeSpecialFloatingPointValues()
方法,但理想情况下,我希望了解我的对象在哪里具有NaN

--------更新----------------

经过艰苦的努力,我认为原因是一个未经初始化的双重身份。我的设置如下所示:

public class Foo {
    private double price;
}

String jsonFromNet = ...;
Foo foo = Gson.fromJson(jsonFromNet);
Gson.toJson(foo, Foo.class); <-- throws the exception
公共类Foo{
私人双价;
}
字符串jsonFromNet=。。。;
Foo-Foo=Gson.fromJson(jsonFromNet);

toJson(foo,foo.class) 严格地说,答案是否定的。我检查了源代码,据我所知,我看不出有什么地方可以自定义行为,从而使用Gson获得所需的功能

但是当我想到这个答案的时候,我想到了4个想法来获取你所需要的信息。最终的目标是不惜一切代价找到球场,不是吗

  • 下载Gson代码,在
    checkValidFloatingPoint
    方法中抛出异常之前放置断点,并在
    com.google.Gson.internal.bind.Adapter.write中检查
    boundField.name
    的值。这是令人不快的领域
  • 下载Gson代码并自定义上一点的方法,以便在捕获IllegalArgumentException时打印出有问题的字段。(提出补丁;))
  • 使用
    serializeSpecialFloatingPointValues()
    ,序列化为JSON字符串,然后使用正则表达式搜索,查找字符串中的每个Nan。附近有您要查找的字段名或数组字段名
  • 构建自己的类扫描程序,通过反射检查每个双字段,以检查值是否为null。当然,在这种情况下,不需要Gson。无论如何,这将是一个有趣的练习
    解决Nan解析问题的最简单方法是替换默认值

    Gson()
    

    下面是一个Android单元测试类示例(Kotlin)

    import com.google.gson.GsonBuilder
    导入org.junit.Assert
    导入org.junit.Test
    NanGSONParsingTest班{
    数据类FloatContainer(val includedFloat:Float)
    @试验
    fun gsonCanHandleNanParsing(){
    val container=FloatContainer(Float.NaN)
    val gson=GsonBuilder().serializeSpecialFloatingPointValues().create()
    val jsonString=gson.toJson(容器)/{“includedFloat”:NaN}
    val parsedBackContainer=gson.fromJson(jsonString,FloatContainer::class.java)
    Assert.assertEquals(容器,parsedBackContainer)
    }
    }
    
    它无法转换为类,因此很难获取类/字段名。如果您可以发布您的代码和正在尝试的JSON,我们可以提供帮助。
    GsonBuilder().serializeSpecialFloatingPointValues().create()
    
    import com.google.gson.GsonBuilder
    import org.junit.Assert
    import org.junit.Test
    
    class NanGSONParsingTest {
        data class FloatContainer(val includedFloat: Float)
    
        @Test
        fun gsonCanHandleNanParsing() {
            val container = FloatContainer(Float.NaN)
            val gson = GsonBuilder().serializeSpecialFloatingPointValues().create()
            val jsonString = gson.toJson(container)//{"includedFloat":NaN}
            val parsedBackContainer = gson.fromJson<FloatContainer>(jsonString, FloatContainer::class.java)
            Assert.assertEquals(container,parsedBackContainer)
        }
    }