Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG]Fastjson2-2.0.28时间格式化报错 #1393

Closed
JavaChinaLive opened this issue Apr 21, 2023 · 13 comments
Closed

[BUG]Fastjson2-2.0.28时间格式化报错 #1393

JavaChinaLive opened this issue Apr 21, 2023 · 13 comments
Labels
bug Something isn't working fixed
Milestone

Comments

@JavaChinaLive
Copy link

问题描述

Fastjson2-2.0.28时间格式化报错

环境信息

请填写以下信息:

  • OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
  • JDK信息: [e.g.:Openjdk 1.8.0_312]
  • 版本信息:[e.g.:Fastjson2 2.0.28]

重现步骤

如何操作可以重现该问题:

  1. 使用 com.alibaba.fastjson2.JSON.parseObject 方法
  2. 输入 VO类 数据
  3. 出现 com.alibaba.fastjson2.JSONException: illegal date input, offset 125, character ", line 1, column 126, fastjson-version 2.0.28 错误
//可在此输入示例代码

相关日志输出

com.alibaba.fastjson2.JSONException: illegal date input, offset 125, character ", line 1, column 126, fastjson-version 2.0.28 {"@type":"com.cashy.payment.domain.vo.PayDeskOneCache","amount":1710000,"currency":"IDR","expireSeconds":43200,"expireTime":"2023-04-21 21:03:43.071","mchOrderNo":"16820426211962643102","merchantId":"2002088","orderNo":"PAYIN8337573427768262656","orderStatus":"PAYING","payCode":"8903909932118062","payProCode":"MandiriVA","qrCodeType":"0"}

@JavaChinaLive JavaChinaLive added the bug Something isn't working label Apr 21, 2023
@JavaChinaLive
Copy link
Author

expireTime 是Date数据类型,数据出现毫秒 就报错Json语法错误
2023-04-21 21:03:43.071

@wenshao wenshao added this to the 2.0.29 milestone Apr 21, 2023
@wenshao
Copy link
Member

wenshao commented Apr 21, 2023

我这里没有重现,能提供更完整的错误堆栈信息么?

@JavaChinaLive
Copy link
Author

com.alibaba.fastjson2.JSONException: illegal date input, offset 124, character ", line 1, column 125, fastjson-version 2.0.28 {"@type":"com.cashy.payment.domain.vo.PayDeskOneCache","amount":700000,"currency":"IDR","expireSeconds":86400,"expireTime":"2023-04-21 16:37:59.072","mchOrderNo":"MCH8337325359814737920","merchantId":"3002094","orderNo":"PAYIN8337325359856680960","orderStatus":"PAYING","payCode":"6321344006656","payProCode":"BRIVA","qrCodeType":"0"} at com.alibaba.fastjson2.JSONReaderUTF16.readMillis19(JSONReaderUTF16.java:5276) at com.alibaba.fastjson2.reader.ObjectReaderImplDate.readDate(ObjectReaderImplDate.java:100) at com.alibaba.fastjson2.reader.ObjectReaderImplDate.readObject(ObjectReaderImplDate.java:71) at com.alibaba.fastjson2.reader.ORG_2_15_PayDeskOneCache.readObject(Unknown Source) at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:125) at com.alibaba.fastjson2.JSON.parseObject(JSON.java:857) at com.cashy.frameworkapp.config.FastJson2JsonRedisSerializer.deserialize(FastJson2JsonRedisSerializer.java:46) at org.springframework.data.redis.core.AbstractOperations.deserializeValue(AbstractOperations.java:335) at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:61) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:222) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:189) at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:53)

@JavaChinaLive
Copy link
Author

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date expireTime;

@JavaChinaLive
Copy link
Author

`package com.cashy.payment.domain.vo;

import java.math.BigDecimal;
import java.util.Date;

import com.alibaba.fastjson2.JSONObject;
import com.cashy.common.config.CustomerBigDecimalSerialize;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import lombok.Data;

@DaTa
public class PayDeskOneCache {
private String merchantId;
private String mchOrderNo;
private String orderNo;
private String currency;
private BigDecimal amount;
@jsonformat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date expireTime;
@jsonformat(pattern = "dd-MM-yyyy HH:mm")
private Date completeTime;
private String payCode;
private String payProCode;
private String qrCodeType;
private String pushNumber;
private String orderStatus;
private Long expireSeconds;

}
`

在Fastjson2-version-2.0.16是正常的,升级到2.0.28就会报错格式化错误

wenshao added a commit that referenced this issue Apr 21, 2023
@EvanMi
Copy link

EvanMi commented Apr 21, 2023

请问这个算bug吗?因为字符串个pattern确实不匹配呀

@JavaChinaLive
Copy link
Author

请问这个算bug吗?因为字符串个pattern确实不匹配呀

感觉有点奇怪,在2.0.16版本没有报错

wenshao added a commit that referenced this issue Apr 21, 2023
@wenshao
Copy link
Member

wenshao commented Apr 21, 2023

Bean bean = JSON.parseObject(json, Bean.class, JSONReader.Feature.SupportSmartMatch);

加上SupportSmartMatch可以自动识别不匹配的格式

@EvanMi
Copy link

EvanMi commented Apr 21, 2023

Bean bean = JSON.parseObject(json, Bean.class, JSONReader.Feature.SupportSmartMatch);

加上SupportSmartMatch可以自动识别不匹配的格式

确实,加上不报错,还能正确解析

@wenshao wenshao added the fixed label Apr 22, 2023
@wenshao
Copy link
Member

wenshao commented Apr 22, 2023

@wenshao wenshao closed this as completed Apr 22, 2023
@JavaChinaLive
Copy link
Author

JavaChinaLive commented Apr 22, 2023 via email

@JavaChinaLive
Copy link
Author

Bean bean = JSON.parseObject(json, Bean.class, JSONReader.Feature.SupportSmartMatch);

加上SupportSmartMatch可以自动识别不匹配的格式

@wenshao 请教个问题,我目前用的是 JSONReader.Feature.SupportAutoType 如果 改成 JSONReader.Feature.SupportSmartMatch ,有没有安全的影响,比如说序列化的漏洞问题

@JavaChinaLive
Copy link
Author

`package com.xxx.framework.config;

import java.nio.charset.Charset;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;

/**

  • Redis使用FastJson序列化
    */
    public class FastJson2JsonRedisSerializer implements RedisSerializer
    {
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class clazz;

    public FastJson2JsonRedisSerializer(Class clazz)
    {
    super();
    this.clazz = clazz;
    }

    @OverRide
    public byte[] serialize(T t) throws SerializationException
    {
    if (t == null)
    {
    return new byte[0];
    }
    return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @OverRide
    public T deserialize(byte[] bytes) throws SerializationException
    {
    if (bytes == null || bytes.length <= 0)
    {
    return null;
    }
    String str = new String(bytes, DEFAULT_CHARSET);

     return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
    

    }
    }
    `

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fixed
Projects
None yet
Development

No branches or pull requests

3 participants