问题描述
使用JSON序列化以及反序列化时,对NaN值的处理不一致,导致无法正确还原值
对默认值的序列化(NotWriteDefaultValue)也存在与预期不一致
之前我看曾经有类似的问题(#1562 #2300),对NaN的处理似乎并没有一个统一的标准,希望能充分讨论一下
环境信息
- JDK信息: [e.g.:Openjdk 21]
- 版本信息:[e.g.:Fastjson2 2.0.54]
重现步骤
@Setter
@Getter
class DoubleTest {
private double primitiveDouble;
private double primitiveDouble2 = Double.NaN;
private Double objectDouble;
private Double objectDouble2 = Double.NaN;
}
@Test
void test() {
DoubleTest value = new DoubleTest();
value.setPrimitiveDouble(Double.NaN);
value.setObjectDouble(Double.NaN);
String json = JSON.toJSONString(value, JSONWriter.Feature.NotWriteDefaultValue);
System.out.println(json);
DoubleTest parsedValue = JSON.parseObject(json, DoubleTest.class);
Assertions.assertEquals(value.getPrimitiveDouble(), parsedValue.getPrimitiveDouble(), 0.00001);
Assertions.assertEquals(value.getObjectDouble(), parsedValue.getObjectDouble(), 0.00001);
}
问题一:primitiveDouble被反序列化后变为了0,objectDouble被反序列化后变为了null,用例无法通过
问题二:即使开启了NotWriteDefaultValue,仍然输出了默认值
期待的正确结果
|
期望JSON |
实际JSON |
期望反序列化结果 |
实际反序列化结果 |
| 原始类型double,值为NaN |
{"double" : "NaN"} |
{"double" : null} |
NaN |
0.0 |
原始类型double,默认值为NaN |
{} |
{"double" : null} |
NaN |
0.0 |
| 包装类型Double,值为NaN |
{"Double" : "NaN"} |
{"Double" : null} |
NaN |
null |
包装类型Double,默认值为NaN |
{} |
{"Double" : null} |
NaN |
null |
对于包装类型的Double如何反序列化的问题,不建议采用{"Double": NaN}这种非标json,其他json框架很可能无法处理。
{"Double":"NaN"}可以是一个选择,和jackson兼容。
相关日志输出
{"primitiveDouble":null,"primitiveDouble2":null,"objectDouble":null,"objectDouble2":null}
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。
问题描述
使用JSON序列化以及反序列化时,对NaN值的处理不一致,导致无法正确还原值
对默认值的序列化(NotWriteDefaultValue)也存在与预期不一致
之前我看曾经有类似的问题(#1562 #2300),对NaN的处理似乎并没有一个统一的标准,希望能充分讨论一下
环境信息
重现步骤
问题一:primitiveDouble被反序列化后变为了0,objectDouble被反序列化后变为了null,用例无法通过
问题二:即使开启了NotWriteDefaultValue,仍然输出了默认值
期待的正确结果
原始类型double,默认值为NaN包装类型Double,默认值为NaN对于包装类型的Double如何反序列化的问题,不建议采用
{"Double": NaN}这种非标json,其他json框架很可能无法处理。{"Double":"NaN"}可以是一个选择,和jackson兼容。相关日志输出
{"primitiveDouble":null,"primitiveDouble2":null,"objectDouble":null,"objectDouble2":null}
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。