From 9fda0a7bd6879f8fc848e396a7beba1b3d7ec844 Mon Sep 17 00:00:00 2001 From: CoderKK Date: Wed, 20 Aug 2025 16:04:18 +0800 Subject: [PATCH] =?UTF-8?q?perf(json):=20=E4=BC=98=E5=8C=96=20Long?= =?UTF-8?q?=E3=80=81BigInteger=E3=80=81BigDecimal=20=E7=9A=84=20JSON=20?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 Long、BigInteger 和 BigDecimal 类型添加自定义序列化器 - 超出 JavaScript 安全整数范围的 Long 值将被序列化为字符串 - BigInteger 和 BigDecimal值将始终被序列化为字符串 --- .../json/serializer/LongJsonSerializer.java | 24 ++++++++++--------- .../lab1024/sa/base/config/JsonConfig.java | 6 +++++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java index aa295489..dfcd6b01 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/LongJsonSerializer.java @@ -1,14 +1,13 @@ package net.lab1024.sa.base.common.json.serializer; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** - * Long类型序列化 + * Long类型序列化 超出 JS 最大最小值 处理 * * @Author 1024创新实验室-主任: 卓大 * @Date 2020-06-02 22:55:07 @@ -20,17 +19,20 @@ public class LongJsonSerializer extends JsonSerializer { public static final LongJsonSerializer INSTANCE = new LongJsonSerializer(); + /** + * JS 安全整数范围 + * 根据 JS Number.MIN_SAFE_INTEGER 与 Number.MAX_SAFE_INTEGER 得来 + */ + private static final long JS_MIN_SAFE_INTEGER = -9007199254740991L; + private static final long JS_MAX_SAFE_INTEGER = 9007199254740991L; + @Override - public void serialize(Long value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { - if (null == value) { - gen.writeNull(); - return; - } - // js中最大安全整数16位 Number.MAX_SAFE_INTEGER - String longStr = String.valueOf(value); - if (longStr.length() > 16) { - gen.writeString(longStr); + public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 如果超出了 JavaScript 安全整数范围,则序列化为字符串 + if (value < JS_MIN_SAFE_INTEGER || value > JS_MAX_SAFE_INTEGER) { + gen.writeString(Long.toString(value)); } else { + // 否则,序列化为数字 gen.writeNumber(value); } } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java index 9164b35c..257899ec 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/JsonConfig.java @@ -2,6 +2,7 @@ package net.lab1024.sa.base.config; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; @@ -13,6 +14,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; +import java.math.BigDecimal; +import java.math.BigInteger; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; @@ -37,6 +40,9 @@ public class JsonConfig { builder.serializers(new LocalDateSerializer(DatePattern.NORM_DATE_FORMAT.getDateTimeFormatter())); builder.serializers(new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMAT.getDateTimeFormatter())); builder.serializerByType(Long.class, LongJsonSerializer.INSTANCE); + builder.serializerByType(Long.TYPE, LongJsonSerializer.INSTANCE); + builder.serializerByType(BigInteger.class, ToStringSerializer.instance); + builder.serializerByType(BigDecimal.class, ToStringSerializer.instance); }; }