Skip to content

Commit

Permalink
修复JSONConfig.setDateFormat设置后setWriteLongAsString失效问题
Browse files Browse the repository at this point in the history
  • Loading branch information
looly committed Aug 30, 2024
1 parent c3b576f commit 9262ace
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@
* @author looly
* @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 final Number number;
private final String format;

/**
* 构造
*
* @param number 数字
* @param format 格式
*/
Expand All @@ -40,7 +41,7 @@ public Object convert(Type targetType, Object value) {
return new DateConverter((Class<? extends Date>) clazz, format).convert(this.number, null);
} else if (TemporalAccessor.class.isAssignableFrom(clazz)) {
return new TemporalAccessorConverter(clazz, format).convert(this.number, null);
} else if(String.class == clazz){
} else if (String.class == clazz) {
return toString();
}

Expand All @@ -51,6 +52,16 @@ public Object convert(Type targetType, Object value) {
return Convert.convertWithCheck(targetType, this.number, null, false);
}

/**
* 获取原始Number
*
* @return 原始Number
* @since 5.8.32
*/
public Object getNumber() {
return this.number;
}

@Override
public int intValue() {
return this.number.intValue();
Expand Down
5 changes: 5 additions & 0 deletions hutool-json/src/main/java/cn/hutool/json/JSONUtil.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.hutool.json;

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cn.hutool.json.serialize;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.NumberWithFormat;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TemporalAccessorUtil;
import cn.hutool.core.date.format.GlobalCustomFormat;
Expand Down Expand Up @@ -254,6 +255,11 @@ private JSONWriter writeObjValue(Object value, Filter<MutablePair<Object, Object
} else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) {
new JSONArray(value).write(writer, indentFactor, indent);
} else if (value instanceof Number) {
// issue#IALQ0N,避免设置日期格式后writeLongAsString失效
if(value instanceof NumberWithFormat){
value = ((NumberWithFormat) value).getNumber();
}

if(value instanceof Long && config.isWriteLongAsString()){
// issue#3541
// long可能溢出,此时可选是否将long写出为字符串类型
Expand Down
3 changes: 2 additions & 1 deletion hutool-jwt/src/test/java/cn/hutool/jwt/IssueI6IS5BTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Date;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class IssueI6IS5BTest {
@Test
public void payloadToBeanTest() {
Expand Down

0 comments on commit 9262ace

Please sign in to comment.