From 45cc6b34343bc133a03c632d6c9dd4a2d895e2e9 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Fri, 10 May 2024 20:37:05 +0800 Subject: [PATCH] fix toJSON date field error, for issue #2550 --- .../fastjson2/writer/ObjectWriterAdapter.java | 6 +- .../alibaba/fastjson/v2issues/Issue2550.java | 83 +++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2550.java diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java index b129d89674..01fc2ac427 100644 --- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java +++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java @@ -616,7 +616,11 @@ public JSONObject toJSONObject(T object, long features) { Class fieldClass = fieldWriter.fieldClass; if (format != null) { if (fieldClass == Date.class) { - fieldValue = DateUtils.format((Date) fieldValue, format); + if ("millis".equals(format)) { + fieldValue = ((Date) fieldValue).getTime(); + } else { + fieldValue = DateUtils.format((Date) fieldValue, format); + } } else if (fieldClass == LocalDate.class) { fieldValue = DateUtils.format((LocalDate) fieldValue, format); } else if (fieldClass == LocalDateTime.class) { diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2550.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2550.java new file mode 100644 index 0000000000..a8c20c283e --- /dev/null +++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2550.java @@ -0,0 +1,83 @@ +package com.alibaba.fastjson.v2issues; + +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 Issue2550 { + @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; + } +}