[alibaba/fastjson]自定义了Long.class和long.class的序列化方式为ToStringSerializer.instance,但在序列化Collection<Long>或long[]时,没有起作用

2024-09-20 401 views
4

fastjson版本:1.2.72,更新到1.2.76也没有修复问题。

问题:

转换为JSON数据后,长整形数字两边没有添加上双引号。

源码错误位置:

跟了一下源码,发现为 ListSerializerCollectionCodec 没有对Long数据进行序列化方式重新获取,而是直接将long值write了。 请修复该问题。

导致的问题:

导致了接口返回数据到前端时,前端接收数据后长数字精度丢失的问题。

回答

2

能给一个测试样例吗? @wangliang181230

1

能给一个测试样例吗? @wangliang181230

@Tloops

public static void main(String[] args) {
    SerializeConfig.getGlobalInstance().put(Long.class, ToStringSerializer.instance);
    SerializeConfig.getGlobalInstance().put(long.class, ToStringSerializer.instance);

    // Long
    System.out.println("Long");
    System.out.println(JSON.toJSONString(Long.MAX_VALUE)); // 输出结果:"9223372036854775807"    ,含双引号,正确的
    System.out.println(JSON.toJSONString(Long.MIN_VALUE)); // 输出结果:"-9223372036854775807"    ,含双引号,正确的

    // Long[]
    Long[] longArr = new Long[2];
    longArr[0] = Long.MAX_VALUE;
    longArr[1] = Long.MIN_VALUE;
    System.out.println("\r\nLong[]");
    System.out.println(JSON.toJSONString(longArr)); // 输出结果:["9223372036854775807","-9223372036854775808"]    ,含双引号,正确的

    // 以下情况为错误的情况

    // long[]
    long[] longArr2 = new long[2];
    longArr2[0] = Long.MAX_VALUE;
    longArr2[1] = Long.MIN_VALUE;
    System.out.println("\r\nlong[]");
    System.out.println(JSON.toJSONString(longArr2)); // 输出结果:[9223372036854775807,-9223372036854775808]    ,不含双引号,错误的

    Collection<Long> coll;
    // ArrayList<Long>
    coll = new ArrayList<>();
    coll.add(Long.MAX_VALUE);
    coll.add(Long.MIN_VALUE);
    System.out.println("\r\nArrayList<Long>");
    System.out.println(JSON.toJSONString(coll)); // 输出结果:[9223372036854775807,-9223372036854775808]    ,不含双引号,错误的

    // LinkedList<Long>
    coll = new LinkedList<>();
    coll.add(Long.MAX_VALUE);
    System.out.println("\r\nLinkedList<Long>");
    System.out.println(JSON.toJSONString(coll)); // 输出结果:[9223372036854775807]    ,不含双引号,错误的

    // HashSet<Long>
    coll = new HashSet<>();
    coll.add(Long.MAX_VALUE);
    coll.add(Long.MIN_VALUE);
    System.out.println("\r\nHashSet<Long>");
    System.out.println(JSON.toJSONString(coll)); // 输出结果:[9223372036854775807,-9223372036854775808]    ,不含双引号,错误的

    // LinkedHashSet<Long>
    coll = new LinkedHashSet<>();
    coll.add(Long.MAX_VALUE);
    System.out.println("\r\nLinkedHashSet<Long>");
    System.out.println(JSON.toJSONString(coll)); // 输出结果:[9223372036854775807]    ,不含双引号,错误的
}
3

刚测了一下,其他类型的List或Set一样也不行。

9

ListSerializer.java的错误代码段: 图片

7

CollectionCodec.java的错误代码段: 图片

5

@wangliang181230 已复现,谢谢。我现在帮忙修一下

3

@Tloops ,好的,麻烦了。

7

@Tloops ,你好,long[] 的情况,也是错误的。

0

PrimitiveArraySerializer.java的错误代码段: 图片

7

@wangliang181230 好的谢谢,已复现问题。现在帮忙修

3

@wenshao 发现其他的诸如int[]Collection<Integer>的实现好像也是写死的,无法自定义序列化方式,不知道这是不是fastjson希望的效果

9

请问,这个问题有没有后续啊?

8

等作者回复吧,看commit历史作者已经两个月没有维护这个项目了……没有办法……

6

哦,no。。。