fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] JSON.toJSON(Bean) with Date

Open Cooperzzy opened this issue 1 year ago • 0 comments

问题描述

可能是修改了对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)

Cooperzzy avatar May 10 '24 01:05 Cooperzzy