fastjson2
fastjson2 copied to clipboard
[BUG] JSONObject.getObject获取List类型数据时获取的数据为无数据空对象
问题描述
使用jsonObject.getObject("key", List.class)时, 获取到的List中的元素均为无数据空对象
环境信息
- OS信息: macOS 10.13.6
- JDK信息:JDK 11.0.2
- 版本信息:2.0.9
重现步骤
使用如下代码进行测试 Map<String, Object> map = null; List<Object> objects = Lists.newArrayList(); for (int i = 0; i < 10; i++) { map = Maps.newHashMap(); map.put("cursor", i); map.put("msg", "11111"); objects.add(map); } JSONObject jsonObject = new JSONObject(); jsonObject.put("data", objects); List data = jsonObject.getObject("data", List.class); System.out.println(JSONObject.toJSONString(data));
期待的正确结果
控制台打印的List数组为含有10个全部有数据元素的List
相关日志输出
控制台打印的data信息: [{},{},{},{},{},{},{},{},{},{}]
附加信息
https://github.com/alibaba/fastjson2/issues/536 之前的问题已修复, 这个问题是使用2.0.9版本验证产生的新问题
fastjson1.x
JSONObject getObject(String key, Class<T> clazz)
调试后发现,fastjson并没有解析,直接返回的
比较引用结果返回true
fastjson2.x
JSONObject getObject(String key, Class<T> type, JSONReader.Feature... features)
ObjectReaderImplList中item的解析问题,item的Type为java.lang.Object,因此没解析出来
综上,建议题主:既然明确List中的元素类型(Map),直接采用这种写法
fastjson2.x下
List data = jsonObject.getList("data", Map.class);
以上如有错误的地方,欢迎大家指正,谢谢
fastjson1.x
JSONObject getObject(String key, Class<T> clazz)
调试后发现,fastjson并没有解析,直接返回的
比较引用结果返回true
fastjson2.x
JSONObject getObject(String key, Class<T> type, JSONReader.Feature... features)
ObjectReaderImplList中item的解析问题,item的Type为java.lang.Object,因此没解析出来
综上,建议题主:既然明确List中的元素类型(Map),直接采用这种写法 fastjson2.x下
List data = jsonObject.getList("data", Map.class);
以上如有错误的地方,欢迎大家指正,谢谢
我们是在fastjson1 升级至fastjson2中发现的这个问题, 目前已通过按JSONArray获取的方式解决, 之前我们的思路是尽量减少api变动做到fastjson1到fastjson2的平滑升级 因而提出的这个问题. 感谢您的建议
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.13.android-SNAPSHOT/ 问题已经修复,请用2.0.13.android-SNAPSHOT帮忙验证,2.0.13版本预计在9月12日前发布
https://github.com/alibaba/fastjson2/releases/tag/2.0.13 2.0.13版本已经发布,请用帮忙用新版本验证