[alibaba/fastjson]yyyyMMddHHmmssSSSZ 格式的时间反序列化失败

2025-10-31 978 views
0

version:1.2.47 com.alibaba.fastjson.util.TypeUtils.castToDate(Object value, String format)

如果时间字符串是'20181011103607186+0800' 因为不包含'-' 所以即使设置 JSON.DEFFAULT_DATE_FORMAT="yyyyMMddHHmmssSSSZ"; 也不能正常解析,如果是西经的时区,例如'20181011103607186-0800',就能正常解析

回答

4

问题没重现

7

可能描述的有点问题,而且开头截图的应该是我之前看到class文件,现在重新描述一下 我现在遇到的问题是,json数据里的时间是string类型,格式是yyyyMMddHHmmssSSSZ 用fastjson反序列化失败. fastsjon的版本:1.2.8 自己调试后,在com.alibaba.fastjson.util.TypeUtils的castToDate(Object value) 方法中看到如下代码(275行): `if (value instanceof String) { String strVal = (String) value;

        if (strVal.indexOf('-') != -1) {
            String format;
            if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) {
                format = JSON.DEFFAULT_DATE_FORMAT;
            } else if (strVal.length() == 10) {
                format = "yyyy-MM-dd";
            } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) {
                format = "yyyy-MM-dd HH:mm:ss";
            } else {
                format = "yyyy-MM-dd HH:mm:ss.SSS";
            }

            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
            try {
                return (Date) dateFormat.parse(strVal);
            } catch (ParseException e) {
                throw new JSONException("can not cast to Date, value : " + strVal);
            }
        }

        if (strVal.length() == 0) {
            return null;
        }

        longValue = Long.parseLong(strVal);
    }`

如果是字符串反序列化成Date,首先会判断是否包含"-" 但是这种带时区的时间字符串,东半球的时间是"20181011103607186+0800"不包含"-",因此直接使用Long.parseLong(strVal)去换装,一定是没法转的.而西半球的时间虽然包含"-" 但是"20181011103607186-0800"和"yyyyMMddHHmmssSSSZ"长度并不相等,即使设置JSON.DEFFAULT_DATE_FORMAT="yyyyMMddHHmmssSSSZ" 也不能正常换装.

现在重新看了源码,好像就是不支持这种格式的时间反序列化?我当初看的class文件不知道为什么看到了对size=22和yyyyMMddHHmmssSSSZ这种格式的特殊处理(1楼截图第三行),所以以为是个bug.

4

用FastJSON解析阿里API返回的数据 日期也是转换失败的 20181229162849000+0800

8
2216 已经复现了 等待修复发布