Java GSON exceptions—打印序列化Nan时出错的字段名
我正在使用Gson,序列化对象时遇到问题: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
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)
}
}