gpt4 book ai didi

java - GSON 异常 - 打印在序列化 Nan 时出错的字段名称

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:46 24 4
gpt4 key购买 nike

我正在使用 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

从我的 api 返回的 json 不包括属性“price”,所以我猜成员变量“d”未初始化。当我去序列化它时,gson 抛出错误。

如果我在序列化之前给“价格”一个显式值,或者它恰好在 api json 响应中,一切正常。

此外,如果我将“价格”从 double 更改为 float ,它似乎并不介意未初始化的状态。

我现在将研究 GsonBuilder.serializeSpecialFloatingPointValues(),我只是想知道如何在这种状态下对 double 进行序列化。我可以使用零或其他默认值。

谢谢

最佳答案

解决 Nan Parsing 这个问题的最简单方法是替换默认值

Gson()

GsonBuilder().serializeSpecialFloatingPointValues().create()

这里以Android单元测试类为例(Kotlin)

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)
}
}

关于java - GSON 异常 - 打印在序列化 Nan 时出错的字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18921261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com