Skip to content

[BUG]升级fastjson2 Double类型反序列化失败兼容性问题 #3955

@chinwe

Description

@chinwe

问题描述

升级至fastjson2,反序列化fastjson包含科学计数法表示的Double值

环境信息

  • OS信息: Windows 10
  • JDK信息: jdk1.8.0_181
  • 版本信息:Fastjson2 2.0.59

fastjson 1.2.83 升级至 fastjson 2.0.59,使用兼容模式

  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.59</version>
  </dependency>

重现步骤

1.如下json反序列化时异常com.alibaba.fastjson2.JSONException: illegal number

package com.alibaba.fastjson;

import lombok.Data;
import org.junit.Assert;
import org.junit.Test;

public class DoubleTest {

    @Data
    private static class DoubleBean {
        private Double test;
    }

    @Test
    public void test() {
        String json =  "{\"@type\":\"com.alibaba.json.DoubleTest$DoubleBean\",\"test\":1.2E-4D}";

        DoubleBean doubleBean = JSON.parseObject(json, DoubleBean.class);
        Assert.assertEquals((Double) 1.2E-4, doubleBean.getTest());
    }
}

fastjson1对应序列化代码

package com.alibaba.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;

import java.util.Map;

public class DoubleTest {

    @Data
    private static class DoubleBean {
        private Double test;
    }

    @Test
    public void test() {
        DoubleBean  bean = new DoubleBean();
        bean.setTest(0.00012);

        String json =  JSON.toJSONString(bean, SerializerFeature.WriteClassName);
        // {"@type":"com.alibaba.json.DoubleTest$DoubleBean","test":1.2E-4D}
        System.out.println(json);
    }
}

期待的正确结果

能保持兼容,正确反序列化。

相关日志输出

Caused by: com.alibaba.fastjson2.JSONException: illegal number, offset 65, char }
at com.alibaba.fastjson2.JSONReader.numberError(JSONReader.java:6596)
at com.alibaba.fastjson2.JSONReaderUTF16.skipNumber(JSONReaderUTF16.java:3208)
at com.alibaba.fastjson2.JSONReaderUTF16.skipValue(JSONReaderUTF16.java:3562)
at com.alibaba.fastjson2.JSONReaderUTF16.skipValue(JSONReaderUTF16.java:3568)
at com.alibaba.fastjson2.reader.ObjectReaderBean.processExtra(ObjectReaderBean.java:134)
at com.alibaba.fastjson2.reader.ObjectReaderBean.processExtra(ObjectReaderBean.java:96)
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.readFieldValue(ObjectReaderAdapter.java:512)
at com.alibaba.fastjson2.reader.ORG_1_1_DoubleBean.readObject(Unknown Source)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:541)
... 25 more

附加信息

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