From dbd92814db90471d3547bbc1e40a395029f7b4d8 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Sep 2024 13:44:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DJSONConfig.setDateFormat?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=90=8EtoBean=E6=97=A0=E6=95=88=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- .../hutool/core/bean/copier/CopyOptions.java | 30 +++++++++++++++++++ .../java/cn/hutool/core/date/DateTime.java | 7 +++++ .../java/cn/hutool/json/JSONConverter.java | 2 +- .../java/cn/hutool/json/Issue3713Test.java | 22 ++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue3713Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ef4987d42..e6ebd2a14 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,11 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.33(2024-08-30) +# 5.8.33(2024-09-02) ### 🐣新特性 ### 🐞Bug修复 +* 【json 】 修复JSONConfig.setDateFormat设置后toBean无效问题(issue#3713@Gitee) ------------------------------------------------------------------------------------------------------------- **# 5.8.32(2024-08-30) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index de5369c45..bdb97c1db 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.PropDesc; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.TypeConverter; +import cn.hutool.core.convert.impl.DateConverter; import cn.hutool.core.lang.Editor; import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; @@ -14,6 +15,7 @@ import cn.hutool.core.util.StrUtil; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Type; +import java.util.Date; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; @@ -96,6 +98,11 @@ public class CopyOptions implements Serializable { return Convert.convertWithCheck(type, value, null, ignoreError); }; + /** + * 在Bean转换时,如果源是String,目标对象是Date或LocalDateTime,则可自定义转换格式 + */ + private String formatIfDate; + //region create /** @@ -359,6 +366,24 @@ public class CopyOptions implements Serializable { return this; } + /** + * 获取日期格式,用于日期转字符串,默认为{@code null} + * @return 日期格式 + */ + public String getFormatIfDate() { + return formatIfDate; + } + + /** + * 设置日期格式,用于日期转字符串,默认为{@code null} + * @param formatIfDate 日期格式 + * @return this + */ + public CopyOptions setFormatIfDate(String formatIfDate) { + this.formatIfDate = formatIfDate; + return this; + } + /** * 使用自定义转换器转换字段值
* 如果自定义转换器为{@code null},则返回原值。 @@ -368,7 +393,12 @@ public class CopyOptions implements Serializable { * @return 编辑后的字段值 * @since 5.8.0 */ + @SuppressWarnings({"unchecked", "rawtypes"}) protected Object convertField(Type targetType, Object fieldValue) { + if((targetType instanceof Class && Date.class.isAssignableFrom((Class) targetType)) && null != this.formatIfDate){ + return new DateConverter((Class) targetType, this.formatIfDate).convert(fieldValue, null); + } + return (null != this.converter) ? this.converter.convert(targetType, fieldValue) : fieldValue; } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index ef36bf1b6..405f8fa3a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -1090,6 +1090,13 @@ public class DateTime extends Date { String pattern; if (dateFormat instanceof SimpleDateFormat) { pattern = ((SimpleDateFormat) dateFormat).toPattern(); + + // issue#3713 尝试使用US Locale解析 + try { + DateUtil.newSimpleFormat(pattern, Locale.US, null).parse(dateStr.toString()); + } catch (Exception ignore) { + // ignore + } } else { pattern = dateFormat.toString(); } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index f17d66427..9d3f82577 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -130,7 +130,7 @@ public class JSONConverter implements Converter { final JSONConfig config = ((JSONGetter) value).getConfig(); final Converter converter = new BeanConverter<>(targetType, - InternalJSONUtil.toCopyOptions(config).setIgnoreError(ignoreError)); + InternalJSONUtil.toCopyOptions(config).setIgnoreError(ignoreError).setFormatIfDate(config.getDateFormat())); return converter.convertWithCheck(value, null, ignoreError); } } diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue3713Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue3713Test.java new file mode 100644 index 000000000..2cd4ec659 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue3713Test.java @@ -0,0 +1,22 @@ +package cn.hutool.json; + +import lombok.Data; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.text.ParseException; +import java.util.Date; + +public class Issue3713Test { + @Test + void toBeanTest() throws ParseException { + String jsonStr = "{\"operDate\":\"Aug 22, 2024, 4:21:21 PM\"}"; + final CustomerCreateLog bean = JSONUtil.toBean(jsonStr, JSONConfig.create().setDateFormat("MMM dd, yyyy, h:mm:ss a"), CustomerCreateLog.class); + Assertions.assertEquals("Thu Aug 22 16:21:21 CST 2024", bean.getOperDate().toString()); + } + + @Data + private static class CustomerCreateLog{ + private Date operDate; + } +}