如何向开源项目提交issue以及为什么开源社区不推荐使用 fastjson库

github 简介

Github是一个面向开源的私有软件托管平台,因为只支持Git作为唯一的版本库格式进行托管,所以叫Github。它于2008年4月10日正式上线,它的开发者也是linux之父:“林纳斯·本纳第克特·托瓦兹”,作为一个分布式的版本控制系统,Github的功能除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,在 GitHub 上托管的版本数量非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、python 等。Github的仓库是他独有的特征,你大可以理解为一个无限容量且没有传输速度限制的网上云盘,但是这个云盘是可以设置公共与私密空间的,在这个开源的时代,你可以通过这个平台看到世界上许多其他大佬的程序作品,并且学习他们的编程思想,而且这很容易获得。

为什么需要向开源项目提交issue

作为开源项目的收益者:广大搬砖程序员们,能为开源项目做贡献是一种荣誉,为社区做贡献也有利于开源项目发展从而使更多的程序员收益.

怎么向开源项目提交issue

进入正题,起因是我在研究 fastjson2 项目库时发现在使用 2.0.18 版本com.alibaba.fastjson2.JSONObject 该类的 getDate 方法时出现了一些时间转换异常,代码如下

/**
 * -*- coding = utf-8 -*-
 *
 * @Author: Created by rio on 2022/9/20 11:26
 * @PACKAGE: test
 * @Software: IntelliJ IDEA
 */
public class Application {
    public static void main(String[] args) {
        try {
            String time = "2000-00-00 00:00:00";
            com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
            jsonObject.put("time", time);
            System.out.println(jsonObject.getDate("time"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

pom 依赖如下

    <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.18</version>
    </dependency>

调用结果如图所示

 

"2000-00-00 00:00:00" 在我们人类看来一个非法的时间戳究竟为何会变成1999年的12月1日呢,究竟是人性的扭曲,还是道德的沦丧

为了一探究竟我们深入源码 debug 发现在 com.alibaba.fastjson2.util 包下的 DateUtils 类负责完成字符串类型的日期转换,且该类的millis方法在不满足

if (zoneId != IOUtils.SHANGHAI_ZONE_ID && zoneId.getRules() != IOUtils.SHANGHAI_ZONE_RULES)

情况下会返回默认毫秒值 943977600000 ,而该值正等于1999-12-01 00:00:00.000,这相当于说再时区 id 等于 SHANGHAI_ZONE_ID 或 时区规则等于 SHANGHAI_ZONE_RULES 时 会给一个默认值,于是我们就看到了开头的 bug

 

提交 bug

那么既然我们发现了 bug,如何提交呢?

 

首先,进入github 开源仓库,如上图所示 可以看到仓库中的 Issues 标签点击 New issue

这里我们可以针对我们的问题进行选择,既然是 bug 我们就点击 bug 栏的 Get started,具体提交格式如下

### 问题描述
*简要描述您碰到的问题。*


### 环境信息
*请填写以下信息:*

 - 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]
 

### 重现步骤
*如何操作可以重现该问题:*

1. 使用 `xxx.xxx` 方法
2. 输入 `...`  数据
3. 出现 `...` 错误
```java
//可在此输入示例代码
```

### 期待的正确结果
*对您期望发生的结果进行清晰简洁的描述。*


### 相关日志输出
*请复制并粘贴任何相关的日志输出。*


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

 我提交完毕之后的 issue 链接如下

[BUG] 输入错误的日期字符串时调用JSONObject.getDate方法输出超出预期 · Issue #912 · alibaba/fastjson2 · GitHub

 问题的解决与自我提升

那么新版是如何解决的呢?通过简单的 debug 我们发现wenshao做了一个简单的判断,当月份不等于0 并且年份不等于 0 时则抛出异常,吐槽: 这个修 bug 的方式确实不敢恭维,为了兼顾 "0000-00-00 00:00:00" 这样的日期格式默认为Thu Jan 01 00:00:00 CST 1970 真的是煞费苦心....

 

那么根据这个逻辑是不是当年份为 0 而月份不为 0 时也能正常运行呢?我们继续探究

果然,我们又得到了一个异常的输出

 

更严重的问题是笔者在输入正常值的情况下居然有时也会抛出异常

"2022-11-09 18:34:00" = Wed Nov 09 18:34:00 CST 2022
"2022-12-09 18:34:00" = java.time.format.DateTimeParseException: illegal input
    at com.alibaba.fastjson2.util.DateUtils.toMillis19(DateUtils.java:2289)
    at com.alibaba.fastjson2.util.DateUtils.parseDate(DateUtils.java:41)
    at com.alibaba.fastjson2.JSONObject.getDate(JSONObject.java:1012)
    at test.Application.main(Application.java:20)

 

 

难道世界上不存在2022-12-09 18:34:00? 在分析了源码之后我们不难理解为什么会出现这种奇怪的报错,这也是为什么开源社区并不推荐使用 fastjson 的原因,即便重构到了 fastjson2 这种兼容代码也是非常难处理的,最后这个 bug 就当做小礼物留给有探索欲的同学提交 issue 吧!
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值