From cb4886cbd2e07add8695f744439feaf774d517e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=B2=90?= Date: Mon, 27 Jan 2025 10:41:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8DLong=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/BigNumberSerializer.java | 41 ++++++++++++++++++++++ .../framework/common/config/JacksonConfig.java | 4 +++ 2 files changed, 45 insertions(+) create mode 100644 maku-framework/src/main/java/net/maku/framework/common/config/BigNumberSerializer.java diff --git a/maku-framework/src/main/java/net/maku/framework/common/config/BigNumberSerializer.java b/maku-framework/src/main/java/net/maku/framework/common/config/BigNumberSerializer.java new file mode 100644 index 0000000..390f603 --- /dev/null +++ b/maku-framework/src/main/java/net/maku/framework/common/config/BigNumberSerializer.java @@ -0,0 +1,41 @@ +package net.maku.framework.common.config; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.ser.std.NumberSerializer; + +import java.io.IOException; + +/** + * 解决js精度丢失问题 + * + * @author 阿沐 babamu@126.com + * MAKU + */ +@JacksonStdImpl +public class BigNumberSerializer extends NumberSerializer { + /** + * JS Number.MAX_SAFE_INTEGER Number.MIN_SAFE_INTEGER + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } +} \ No newline at end of file diff --git a/maku-framework/src/main/java/net/maku/framework/common/config/JacksonConfig.java b/maku-framework/src/main/java/net/maku/framework/common/config/JacksonConfig.java index 6933ff4..f36205d 100644 --- a/maku-framework/src/main/java/net/maku/framework/common/config/JacksonConfig.java +++ b/maku-framework/src/main/java/net/maku/framework/common/config/JacksonConfig.java @@ -38,6 +38,10 @@ public class JacksonConfig { builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); // builder.serializationInclusion(JsonInclude.Include.NON_NULL); + + // 避免Long精度丢失,超过JS最大精度,使用String类型 + builder.serializerByType(Long.class, BigNumberSerializer.INSTANCE); + builder.failOnUnknownProperties(false); builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); };