fastjson icon indicating copy to clipboard operation
fastjson copied to clipboard

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

Open wangliang181230 opened this issue 3 years ago • 14 comments

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

问题:

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

源码错误位置:

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

导致的问题:

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

wangliang181230 avatar Apr 16 '21 03:04 wangliang181230

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

Tloops avatar Apr 17 '21 07:04 Tloops

能给一个测试样例吗? @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]    ,不含双引号,错误的
}

wangliang181230 avatar Apr 20 '21 09:04 wangliang181230

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

wangliang181230 avatar Apr 20 '21 09:04 wangliang181230

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

wangliang181230 avatar Apr 20 '21 09:04 wangliang181230

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

wangliang181230 avatar Apr 20 '21 09:04 wangliang181230

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

Tloops avatar Apr 20 '21 09:04 Tloops

@Tloops ,好的,麻烦了。

wangliang181230 avatar Apr 20 '21 09:04 wangliang181230

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

wangliang181230 avatar Apr 21 '21 02:04 wangliang181230

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

wangliang181230 avatar Apr 21 '21 02:04 wangliang181230

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

Tloops avatar Apr 21 '21 02:04 Tloops

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

Tloops avatar Apr 21 '21 02:04 Tloops

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

wangliang181230 avatar Jun 01 '21 10:06 wangliang181230

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

Tloops avatar Jun 01 '21 11:06 Tloops

哦,no。。。

wangliang181230 avatar Jun 03 '21 03:06 wangliang181230