不好意思,Fastjson 真的该换了!
共 7952字,需浏览 16分钟
·
2024-05-24 00:00
阅读本文大概需要 8 分钟。
来自:juejin.cn/post/7215886869199863869
-
记者: 大爷您有什么特长呀? -
fastjson: 我很快。 -
记者: 23423乘以4534等于多少? -
fastjson: 等于2343. -
记者: ?? -
fastjson: 你就说快不快吧!
dateformat优先级
yyyy-MM-dd HH:mmss
,于是我愉快的在javabean的属性上加了个注解。
@JSONField(format="yyyy-MM-dd")
VM options
添加 -Dos.name=linux
这不能完全模拟linux系统,只针对通过 System.getproperty("os.name")
来判断当前系统做某些操作的时候有用。
JSONSerializer
类,主要是writeWithFormat
方法。没有发现问题。
JSONSerializer.dateFormatPattern
上发现了这段注释。
#1868
,这通常是github的问题编号。
-
对于开源项目来说,解决了BUG,通常会把问题编号放到注释里面去。前提是注释有必要。通过问题编号可以看到问题的前因后果。 -
通常来说,对于github开源项目都有issue区,拿着这个到编号直接到issue一搜就能搜到。 -
但也有一些项级项目,如spark,flink是没有issue区的,它们的类型问题发现描述追踪都使用jira平台。
如: https://issues.apache.org/jira/browse/SPARK-38349%EF%BC%8C
在提交PR的时候标题也严格按照[jira 编号][spark 子模块(如core/sql) title]的规则来。
https://github.com/alibaba/fastjson/issues/1868
https://github.com/alibaba/fastjson/pull/2706
#1868
#1968
#2029
#24524
个。
那就是,测试环境所用的fastjson版本是低于1.2.72的。
复盘,遇到Fastjson的问题,一开始就应该奔着github的issues区,它大概率已经被前人踩坑了。
$ref
循环引用问题
public ResultBody test () {
List<Person> list = new ArrayList<>();
Person obj1 = new Person("张三", 48);
list.add(obj1);
Person obj2 = new Person("李四", 23);
list.add(obj2);
Person obj3 = new Person("王麻子", 17);
list.add(obj3);
List<Person> young = list.stream().filter(e -> e.getAge() <= 45).collect(Collectors.toList());
List<Person> children = list.stream().filter(e -> e.getAge()< 18).collect(Collectors.toList());
HashMap map = new HashMap();
map.put("young", young);
map.put("children", children);
return ResultBody.success(map);
}
{
"code":"200",
"message":"成功!",
"result":{
"young":[
{
"age":23,
"name":"李四"
},
{
"age":17,
"name":"王麻子"
}
],
"children":[
{"$ref":"$.result.young[1]"}
]
}
}
$ref
。
https://github.com/alibaba/fastjson/issues/3643
SerializerFeature.DisableCircularReferenceDetect
可以避免这个问题。
$ref":"$.result.young[1]
"这种文本,它能解析吗?它不能呀。我测试了一下,好像使用fastjson也并不能解析回来:
注:经提醒,这里应使用完整报文解析,经测试,确实可以。感谢提醒!
SerializerFeature.WriteMapNullValue
。
WriteNullListAsEmpty
就很好,不错的设计点,如果返回的list为null的时候,用户可以选择让它序列化为[],但它也不是默认开启的呀,给了用户额外的选择权,对吧。
总结
-
review、testcase覆盖不是很到位 -
contributor看起来很多,但严重依赖主力人员。而主力精力有限,某些优先级不那么高的BUG只能放任。 -
这个项目的荣誉感并没有那么高,或者叫并没有那么吸引高手)。 -
有些功能点应该把控制主动权交给用户,如 DisableCircularReferenceDetect
,WriteMapNullValue
等。默认开启非常容易导致线上暴雷。 -
作者已经全面转向fastjosn2,而且哪怕在这之前,对于fastjson没有一个稳定维护的版本,不断升级,不断引入新问题。
推荐阅读:
官方推出了 Spring AI 框架,Java集成 AI 不再是难事!
Spring Boot 如何防护 XSS + SQL 注入攻击 ?终于懂了!
《云服务器限时免费领取》 轻量级服务器-2核4G5M 1个月 云服务器-2核4G3M 1个月 ⬇戳阅读原文领取 朕已阅