fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG]2.0.45 JSONObject 反系列化字段结果为null

Open Apyz opened this issue 1 year ago • 4 comments

问题描述

fastjson升级后,最新版本的fastjson反序列化得到的所有数据都是null,fastjson1从未出现过这个问题。我想着今天升级一下,结果就出现了这个毛病。

环境信息

  • OS信息: win10系统
  • JDK信息:LibericaJDK-17
  • 版本信息:Fastjson2 2.0.45

重现步骤

反序列化即可重现,使用的是JSONObject.parseObject() 以及 JSON.parseObject() 两个都有问题。

  1. 使用 JSON.parseObject() 方法
  2. 输入 数据太长 数据
  3. 出现 返回对象 key value 都是 null 错误
Response response = client.newCall(request).execute();
          String jsonBean = response.body().string();
          System.out.println(jsonBean);

          GetListResult result = JSON.parseObject(jsonBean, GetListResult.class);
          String anAbstract = result.getContents().get(0).getArticle_attr().get__Abstract();
          System.out.println(result.getContents().get(0).getArticle_attr().getArticle_type());
          System.out.println(anAbstract);

期待的正确结果

期望获得正确的key和value,因为是有值的。

相关日志输出

"verify_reason":"","visibility_level":40},"article_stat":{"answer_count":0,"comment_count":0,"counters":[{"Count":4055,"Name":"展现"},{"Count":81,"Name":"阅读"},{"Count":0,"Name":"评论"},{"Count":6,"Name":"点赞"}],"digg_count":6,"go_detail_count":81,"impression_count":4055,"play_count":0,"repin_count":0}}],"count":10,"end_cursor":1693691437,"has_more":true,"message":"success","page_time":[{"index":1,"time_stamp":0},{"index":2,"time_stamp":0},{"index":32,"time_stamp":0},{"index":33,"time_stamp":0}],"total_count":325} 没有京东方,现在的电视机,显示器价格至少翻十倍…京东方这个企业还是干正事的。投资出来做实业就好,看得见的就业岗位,就怕有些骗钱的ppt公司啊。。。

null: null null: null null: null null: null Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.trim()" because "name" is null at weitoutiao.WTTGetList.delete(WeiTouTiaoGetList.java:90) at weitoutiao.WTTGetList.main(WeiTouTiaoGetList.java:32)

附加信息

2024-02-05_174847

Apyz avatar Feb 05 '24 09:02 Apyz

能否提供下简单示例?

yanxutao89 avatar Feb 05 '24 14:02 yanxutao89

能否提供下简单示例?

老哥,找到问题了。fastjson1的时候,能自动解析首字母大写的key,我也没配置过。到了fastjson2各种问题都出来了,首字母大写的key全是null。特殊字符的key,getter 和 setter方法也得添加@JSONField名称映射,否则也全是null。fastjson1只需要在对象上添加@JSONField名称映射就能获取的。不过问题已经解决,也就不说什么了。我谈下解决方式吧。

String jsonBean = "{\"answer_count\":0,\"comment_count\":891,\"counters\":[{\"Count\":2084394,\"Name\":\"展现\"},{\"Count\":223516,\"Name\":\"阅读\"},{\"Count\":891,\"Name\":\"评论\"},{\"Count\":2902,\"Name\":\"点赞\"}],\"digg_count\":2902,\"go_detail_count\":223516,\"impression_count\":2084394,\"play_count\":0,\"repin_count\":0}";
// Feature.DisableFieldSmartMatch
JSON.config(JSONReader.Feature.SupportSmartMatch);
Result result = JSON.parseObject(jsonBean, Result.class);
Result.Counters counters = result.getCounters().get(0);
System.out.println("name:" + counters.getName());
System.out.println("name:" + counters.getCount());
JSON.config(JSONReader.Feature.SupportSmartMatch);

特性那里要配置支持智能匹配,否则获取的首字母大写的key全是null,也是简直了,这东西居然不是默认的,fastjson1的时候,这都不需要操心的,直接上,啥都能给匹配上。

Apyz avatar Feb 05 '24 23:02 Apyz

这样全局配置:

JSON.config(JSONReader.Feature. SupportSmartMatch);

wenshao avatar Feb 07 '24 00:02 wenshao

fastjson 1.x缺省SupportSmartMatch有些场景符合客户的需求,有些场景则不是,收到了很多反馈和答疑。于是在2.x中就不是缺省打开了。

wenshao avatar Feb 07 '24 01:02 wenshao