修复JSONConfig.setDateFormat设置后setWriteLongAsString失效问题

This commit is contained in:
Looly 2024-08-30 18:39:31 +08:00
parent c3b576f698
commit 9262ace7da
4 changed files with 26 additions and 3 deletions

View File

@ -13,7 +13,7 @@ import java.util.Date;
* @author looly * @author looly
* @since 5.8.13 * @since 5.8.13
*/ */
public class NumberWithFormat extends Number implements TypeConverter{ public class NumberWithFormat extends Number implements TypeConverter {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final Number number; private final Number number;
@ -21,6 +21,7 @@ public class NumberWithFormat extends Number implements TypeConverter{
/** /**
* 构造 * 构造
*
* @param number 数字 * @param number 数字
* @param format 格式 * @param format 格式
*/ */
@ -40,7 +41,7 @@ public class NumberWithFormat extends Number implements TypeConverter{
return new DateConverter((Class<? extends Date>) clazz, format).convert(this.number, null); return new DateConverter((Class<? extends Date>) clazz, format).convert(this.number, null);
} else if (TemporalAccessor.class.isAssignableFrom(clazz)) { } else if (TemporalAccessor.class.isAssignableFrom(clazz)) {
return new TemporalAccessorConverter(clazz, format).convert(this.number, null); return new TemporalAccessorConverter(clazz, format).convert(this.number, null);
} else if(String.class == clazz){ } else if (String.class == clazz) {
return toString(); return toString();
} }
@ -51,6 +52,16 @@ public class NumberWithFormat extends Number implements TypeConverter{
return Convert.convertWithCheck(targetType, this.number, null, false); return Convert.convertWithCheck(targetType, this.number, null, false);
} }
/**
* 获取原始Number
*
* @return 原始Number
* @since 5.8.32
*/
public Object getNumber() {
return this.number;
}
@Override @Override
public int intValue() { public int intValue() {
return this.number.intValue(); return this.number.intValue();

View File

@ -1,5 +1,6 @@
package cn.hutool.json; package cn.hutool.json;
import cn.hutool.core.convert.NumberWithFormat;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.file.FileReader; import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.lang.TypeReference; import cn.hutool.core.lang.TypeReference;
@ -754,6 +755,10 @@ public class JSONUtil {
|| object instanceof Number // || object instanceof Number //
|| ObjectUtil.isBasicType(object) // || ObjectUtil.isBasicType(object) //
) { ) {
if(object instanceof Number && null != jsonConfig.getDateFormat()){
// 当JSONConfig中设置了日期格式则包装为NumberWithFormat以便在Converter中使用自定义格式转换日期时间
return new NumberWithFormat((Number) object, jsonConfig.getDateFormat());
}
return object; return object;
} }

View File

@ -1,6 +1,7 @@
package cn.hutool.json.serialize; package cn.hutool.json.serialize;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.NumberWithFormat;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.date.TemporalAccessorUtil;
import cn.hutool.core.date.format.GlobalCustomFormat; import cn.hutool.core.date.format.GlobalCustomFormat;
@ -254,6 +255,11 @@ public class JSONWriter extends Writer {
} else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) { } else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) {
new JSONArray(value).write(writer, indentFactor, indent); new JSONArray(value).write(writer, indentFactor, indent);
} else if (value instanceof Number) { } else if (value instanceof Number) {
// issue#IALQ0N避免设置日期格式后writeLongAsString失效
if(value instanceof NumberWithFormat){
value = ((NumberWithFormat) value).getNumber();
}
if(value instanceof Long && config.isWriteLongAsString()){ if(value instanceof Long && config.isWriteLongAsString()){
// issue#3541 // issue#3541
// long可能溢出此时可选是否将long写出为字符串类型 // long可能溢出此时可选是否将long写出为字符串类型

View File

@ -5,13 +5,14 @@ import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import lombok.Data; import lombok.Data;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class IssueI6IS5BTest { public class IssueI6IS5BTest {
@Test @Test
public void payloadToBeanTest() { public void payloadToBeanTest() {