fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] com.alibaba.fastjson.JSONObject.toJSON 方法转换中对于 HashMap<Integer, String> 未向前兼容

Open Nu1l998 opened this issue 1 month ago • 1 comments

问题描述

在 2.0.58 及以后版本中 HashMap<Integer, String> 对象在使用 JSONObject.toJSON(map) 方法 无法正确转换。

环境信息

请填写以下信息:

  • OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
  • JDK信息: [e.g.:Openjdk 1.8.0_312]
  • 版本信息:[e.g.:Fastjson2 2.x.x]

重现步骤

import com.alibaba.fastjson.JSONObject;


HashMap<Integer, String> map = new HashMap<>();
map.put(1, "1");
map.put(2, "2");
System.out.println(JSONObject.toJSON(map));

在 com.alibaba.fastjson 2.0.57 中可以正常执行并打印

{1:"1",2:"2"}

但是在 com.alibaba.fastjson 2.0.58 及以后的版本后 会抛出异常

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at com.alibaba.fastjson.JSON.adaptResult(JSON.java:2329)
	at com.alibaba.fastjson.JSON.adaptResult(JSON.java:2318)
	at com.alibaba.fastjson.JSON.toJSON(JSON.java:2311)
	at org.example.Main.main(Main.java:16)

定位到是 Submit:23ac0978 Fix 3185 (#3593 提交修改增加 private static Object adaptResult(Object result, int level) 在针对 fastjson2转换为 fastjson 对象时未对 对象进行安全转换。

相关代码:

        if (result instanceof com.alibaba.fastjson2.JSONObject) {
            JSONObject jsonObject = new JSONObject();
            com.alibaba.fastjson2.JSONObject object = (com.alibaba.fastjson2.JSONObject) result;
            for (Map.Entry<String, Object> entry : object.entrySet()) {
                jsonObject.put(entry.getKey(), adaptResult(entry.getValue(), level + 1));  // entry.getKey() 在上述案例中为Integer 类型
            }
            return jsonObject;
        }

期待的正确结果

期望版本可以尽量向前兼容。

附加信息

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

Nu1l998 avatar Oct 29 '25 11:10 Nu1l998

感谢反馈,我已提交补丁

jujn avatar Oct 29 '25 12:10 jujn