mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
增加JSONConfig.setNumberWriteMode
This commit is contained in:
parent
b859cf4913
commit
3f7f05b9ee
@ -15,6 +15,7 @@ package org.dromara.hutool.json;
|
|||||||
import org.dromara.hutool.core.comparator.CompareUtil;
|
import org.dromara.hutool.core.comparator.CompareUtil;
|
||||||
import org.dromara.hutool.core.convert.Converter;
|
import org.dromara.hutool.core.convert.Converter;
|
||||||
import org.dromara.hutool.json.convert.JSONConverter;
|
import org.dromara.hutool.json.convert.JSONConverter;
|
||||||
|
import org.dromara.hutool.json.writer.NumberWriteMode;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@ -64,6 +65,10 @@ public class JSONConfig implements Serializable {
|
|||||||
* 自定义的类型转换器,用于在getXXX操作中自动转换类型
|
* 自定义的类型转换器,用于在getXXX操作中自动转换类型
|
||||||
*/
|
*/
|
||||||
private Converter converter = JSONConverter.of(this);
|
private Converter converter = JSONConverter.of(this);
|
||||||
|
/**
|
||||||
|
* Number写出模式
|
||||||
|
*/
|
||||||
|
private NumberWriteMode numberWriteMode = NumberWriteMode.NORMAL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建默认的配置项
|
* 创建默认的配置项
|
||||||
@ -257,6 +262,7 @@ public class JSONConfig implements Serializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取自定义的类型转换器,用于在序列化、反序列化操作中实现对象类型转换
|
* 获取自定义的类型转换器,用于在序列化、反序列化操作中实现对象类型转换
|
||||||
|
*
|
||||||
* @return 转换器
|
* @return 转换器
|
||||||
*/
|
*/
|
||||||
public Converter getConverter() {
|
public Converter getConverter() {
|
||||||
@ -265,9 +271,33 @@ public class JSONConfig implements Serializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置自定义的类型转换器,用于在序列化、反序列化操作中实现对象类型转换
|
* 设置自定义的类型转换器,用于在序列化、反序列化操作中实现对象类型转换
|
||||||
|
*
|
||||||
* @param converter 转换器
|
* @param converter 转换器
|
||||||
*/
|
*/
|
||||||
public void setConverter(final Converter converter) {
|
public void setConverter(final Converter converter) {
|
||||||
this.converter = converter;
|
this.converter = converter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Number写出模式
|
||||||
|
*
|
||||||
|
* @return Number写出模式
|
||||||
|
* @since 6.0.0
|
||||||
|
*/
|
||||||
|
public NumberWriteMode getNumberWriteMode() {
|
||||||
|
return numberWriteMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置数字写出模式<br>
|
||||||
|
* 考虑到在JS或其他环境中,Number超过一定长度会丢失精度,因此针对Number类型值,可选写出规则
|
||||||
|
*
|
||||||
|
* @param numberWriteMode Number写出模式
|
||||||
|
* @return this
|
||||||
|
* @since 6.0.0
|
||||||
|
*/
|
||||||
|
public JSONConfig setNumberWriteMode(final NumberWriteMode numberWriteMode) {
|
||||||
|
this.numberWriteMode = numberWriteMode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,12 @@ import org.dromara.hutool.json.JSONConfig;
|
|||||||
* @since 6.0.0
|
* @since 6.0.0
|
||||||
*/
|
*/
|
||||||
public class NumberValueWriter implements JSONValueWriter<Number> {
|
public class NumberValueWriter implements JSONValueWriter<Number> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JS中表示的数字最大值
|
||||||
|
*/
|
||||||
|
private static final long JS_MAX_NUMBER = 9007199254740992L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单例对象
|
* 单例对象
|
||||||
*/
|
*/
|
||||||
@ -39,7 +45,24 @@ public class NumberValueWriter implements JSONValueWriter<Number> {
|
|||||||
public void write(final JSONWriter writer, final Number number) {
|
public void write(final JSONWriter writer, final Number number) {
|
||||||
final JSONConfig config = writer.getConfig();
|
final JSONConfig config = writer.getConfig();
|
||||||
// since 5.6.2可配置是否去除末尾多余0,例如如果为true,5.0返回5
|
// since 5.6.2可配置是否去除末尾多余0,例如如果为true,5.0返回5
|
||||||
final boolean isStripTrailingZeros = null == config || config.isStripTrailingZeros();
|
final boolean isStripTrailingZeros = (null == config) || config.isStripTrailingZeros();
|
||||||
writer.writeRaw(NumberUtil.toStr(number, isStripTrailingZeros));
|
final String numberStr = NumberUtil.toStr(number, isStripTrailingZeros);
|
||||||
|
|
||||||
|
final NumberWriteMode numberWriteMode = (null == config) ? NumberWriteMode.NORMAL : config.getNumberWriteMode();
|
||||||
|
switch (numberWriteMode){
|
||||||
|
case JS:
|
||||||
|
if(number.longValue() > JS_MAX_NUMBER){
|
||||||
|
writer.writeQuoteStrValue(numberStr);
|
||||||
|
} else{
|
||||||
|
writer.writeRaw(numberStr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
writer.writeQuoteStrValue(numberStr);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
writer.writeRaw(numberStr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2024. looly(loolly@aliyun.com)
|
||||||
|
* Hutool is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* https://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.dromara.hutool.json.writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Long写出模式<br>
|
||||||
|
* 考虑到在JS或其他环境中,Long超过一定长度会丢失精度,因此针对Long类型值,可选写出规则
|
||||||
|
*
|
||||||
|
* @author Looly
|
||||||
|
* @since 6.0.0
|
||||||
|
*/
|
||||||
|
public enum NumberWriteMode {
|
||||||
|
/**
|
||||||
|
* 一般模式,所有Long值写出为普通数字,如{"value": 123456789}
|
||||||
|
*/
|
||||||
|
NORMAL,
|
||||||
|
/**
|
||||||
|
* 浏览器中Javascript兼容模式,此模式下,如果Long输出长度大于
|
||||||
|
*/
|
||||||
|
JS,
|
||||||
|
/**
|
||||||
|
* 所有Long类型的数字均转为字符串形式,如{"value": "123456789"}
|
||||||
|
*/
|
||||||
|
STRING
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package org.dromara.hutool.json.writer;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.dromara.hutool.json.JSONConfig;
|
||||||
|
import org.dromara.hutool.json.JSONUtil;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class Issue3541Test {
|
||||||
|
@Test
|
||||||
|
void writeNumberJSTest() {
|
||||||
|
final Demo demo = new Demo();
|
||||||
|
// 超出长度
|
||||||
|
demo.setId(1227690722069581409L);
|
||||||
|
demo.setName("hutool");
|
||||||
|
final String jsonStr = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.JS));
|
||||||
|
Assertions.assertEquals("{\"id\":\"1227690722069581409\",\"name\":\"hutool\"}", jsonStr);
|
||||||
|
|
||||||
|
// 未超出长度
|
||||||
|
demo.setId(1227690722069581L);
|
||||||
|
final String jsonStr2 = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.JS));
|
||||||
|
Assertions.assertEquals("{\"id\":1227690722069581,\"name\":\"hutool\"}", jsonStr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void writeNumberStringTest() {
|
||||||
|
final Demo demo = new Demo();
|
||||||
|
// 超出长度
|
||||||
|
demo.setId(1227690722069581409L);
|
||||||
|
demo.setName("hutool");
|
||||||
|
final String jsonStr = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.STRING));
|
||||||
|
Assertions.assertEquals("{\"id\":\"1227690722069581409\",\"name\":\"hutool\"}", jsonStr);
|
||||||
|
|
||||||
|
// 未超出长度
|
||||||
|
demo.setId(1227690722069581L);
|
||||||
|
final String jsonStr2 = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.STRING));
|
||||||
|
Assertions.assertEquals("{\"id\":\"1227690722069581\",\"name\":\"hutool\"}", jsonStr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void writeNumberNormalTest() {
|
||||||
|
final Demo demo = new Demo();
|
||||||
|
// 超出长度
|
||||||
|
demo.setId(1227690722069581409L);
|
||||||
|
demo.setName("hutool");
|
||||||
|
final String jsonStr = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.NORMAL));
|
||||||
|
Assertions.assertEquals("{\"id\":1227690722069581409,\"name\":\"hutool\"}", jsonStr);
|
||||||
|
|
||||||
|
// 未超出长度
|
||||||
|
demo.setId(1227690722069581L);
|
||||||
|
final String jsonStr2 = JSONUtil.toJsonStr(demo, JSONConfig.of().setNumberWriteMode(NumberWriteMode.NORMAL));
|
||||||
|
Assertions.assertEquals("{\"id\":1227690722069581,\"name\":\"hutool\"}", jsonStr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Demo {
|
||||||
|
private Long id;
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user