Skip to content

[BUG]无法正确处理double类型的NaN值 #3911

@demonbug

Description

@demonbug

问题描述

使用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}

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions