fastjson2
fastjson2 copied to clipboard
[BUG] JSON.toJSON(Bean) with Date
问题描述
可能是修改了对date的处理,以下代码在fastjson 2.0.49通过,在fastjson2-2.0.49 和 fastjson 2.0.50-SNAPSHOT中异常,也许有问题。
环境信息
- OS信息: [MacOS 12.7.4 M1 Pro 16 GB]
- JDK信息: [Openjdk 17.0.6]
- 版本信息:[Fastjson 2.0.49/2.0.50-SNAPSHOT]
重现步骤
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.annotation.JSONField;
import org.junit.jupiter.api.Test;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MutatedIssue460_326_1 {
@Test
public void mutatedTest1() {
Bean1 bean = new Bean1();
bean.date = new Date(1655097829796L);
String str = JSON.toJSON(bean).toString();
assertEquals("{\"date\":1655097829796}", str);
Bean1 bean1 = JSON.parseObject(str, Bean1.class);
assertEquals(bean.date.getTime(), bean1.date.getTime());
Bean1 bean2 = JSON.parseObject(str).toJavaObject(Bean1.class);
assertEquals(bean.date.getTime(), bean2.date.getTime());
}
public static class Bean1 {
@JSONField(format = "millis")
public Date date;
}
@Test
public void mutatedTest2() {
Bean2 bean = new Bean2();
bean.date = new Date(1655097829796L);
String str = JSON.toJSON(bean).toString();
assertEquals("{\"date\":1655097829796}", str);
Bean2 bean1 = JSON.parseObject(str, Bean2.class);
assertEquals(bean.date.getTime(), bean1.date.getTime());
Bean2 bean2 = JSON.parseObject(str).toJavaObject(Bean2.class);
assertEquals(bean.date.getTime(), bean2.date.getTime());
}
public static class Bean2 {
@JSONField(format = "millis")
public Date date;
}
@Test
public void mutatedTest1fj() {
Bean1fj bean = new Bean1fj();
bean.date = new Date(1655097829796L);
String str = com.alibaba.fastjson.JSON.toJSON(bean).toString();
assertEquals("{\"date\":1655097829796}", str);
Bean1fj bean1 = com.alibaba.fastjson.JSON.parseObject(str, Bean1fj.class);
assertEquals(bean.date.getTime(), bean1.date.getTime());
Bean1fj bean2 = com.alibaba.fastjson.JSON.parseObject(str).toJavaObject(Bean1fj.class);
assertEquals(bean.date.getTime(), bean2.date.getTime());
}
public static class Bean1fj {
@com.alibaba.fastjson.annotation.JSONField(format = "millis")
public Date date;
}
@Test
public void mutatedTest2fj() {
Bean2fj bean = new Bean2fj();
bean.date = new Date(1655097829796L);
String str = com.alibaba.fastjson.JSON.toJSON(bean).toString();
assertEquals("{\"date\":1655097829796}", str);
Bean2fj bean1 = com.alibaba.fastjson.JSON.parseObject(str, Bean2fj.class);
assertEquals(bean.date.getTime(), bean1.date.getTime());
Bean2fj bean2 = com.alibaba.fastjson.JSON.parseObject(str).toJavaObject(Bean2fj.class);
assertEquals(bean.date.getTime(), bean2.date.getTime());
}
public static class Bean2fj {
@com.alibaba.fastjson.annotation.JSONField(format = "millis")
public Date date;
}
}
期待的正确结果
(可能源码实现修改了?)期望正常序列化
相关日志输出
java.lang.IllegalArgumentException: Unknown pattern letter: i
at java.base/java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1882)
at java.base/java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1772)
at java.base/java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:566)
at com.alibaba.fastjson2.util.DateUtils.format(DateUtils.java:10993)
at com.alibaba.fastjson2.writer.ObjectWriterAdapter.toJSONObject(ObjectWriterAdapter.java:619)
at com.alibaba.fastjson2.JSON.toJSON(JSON.java:3726)
at com.alibaba.fastjson2.JSON.toJSON(JSON.java:3700)
at MutatedIssue460_326_1.mutatedTest1(MutatedIssue460_326_1.java:18)