diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Converter.java b/hutool-core/src/main/java/cn/hutool/core/convert/Converter.java index 36f04b58b..cf4be2aaa 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Converter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Converter.java @@ -18,7 +18,7 @@ public interface Converter { * 如果类型无法确定,将读取默认值的类型做为目标类型 * * @param targetType 目标Type,非泛型类使用 - * @param value 原始值 + * @param value 原始值,如果对象实现了此接口,则value为this * @return 转换后的值 * @throws ConvertException 转换无法正常完成或转换异常时抛出此异常 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/BeanConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/BeanConverter.java index 324843a4b..c6220ff88 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/BeanConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/BeanConverter.java @@ -30,6 +30,9 @@ import java.util.Map; public class BeanConverter implements Converter, Serializable { private static final long serialVersionUID = 1L; + /** + * 单例对象 + */ public static BeanConverter INSTANCE = new BeanConverter(); private final CopyOptions copyOptions; @@ -51,7 +54,7 @@ public class BeanConverter implements Converter, Serializable { } @Override - public Object convert(Type targetType, Object value) throws ConvertException { + public Object convert(final Type targetType, final Object value) throws ConvertException { Assert.notNull(targetType); if (null == value) { return null; @@ -62,7 +65,7 @@ public class BeanConverter implements Converter, Serializable { return ((Converter) value).convert(targetType, value); } - Class targetClass = TypeUtil.getClass(targetType); + final Class targetClass = TypeUtil.getClass(targetType); Assert.notNull(targetClass, "Target type is not a class!"); return convertInternal(targetType, targetClass, value); diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index a8b67a2d0..3c6aff99d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -17,6 +17,9 @@ import java.util.Calendar; public class DateConverter extends AbstractConverter { private static final long serialVersionUID = 1L; + /** + * 单例 + */ public static final DateConverter INSTANCE = new DateConverter(); /** diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/getter/TypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/lang/getter/TypeGetter.java index 7340064c9..079bd2090 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/getter/TypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/getter/TypeGetter.java @@ -1,6 +1,8 @@ package cn.hutool.core.lang.getter; +import cn.hutool.core.convert.CompositeConverter; import cn.hutool.core.convert.Convert; +import cn.hutool.core.convert.Converter; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -89,7 +91,21 @@ public interface TypeGetter { * @return 结果值 */ default T get(final K key, final Type type, final T defaultValue) { - return Convert.convert(type, getObj(key), defaultValue); + return get(key, type, CompositeConverter.getInstance(), defaultValue); + } + + /** + * 获取指定类型的值,默认自动转换值类型 + * + * @param 目标类型 + * @param key 键 + * @param type 目标类型 + * @param converter 自定义转换器 + * @param defaultValue 默认值 + * @return 结果值 + */ + default T get(final K key, final Type type, final Converter converter, final T defaultValue) { + return converter.convert(type, getObj(key), defaultValue); } /** diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java index 063cd7d04..bfcffeb5f 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java @@ -8,6 +8,7 @@ import cn.hutool.core.convert.impl.TemporalAccessorConverter; import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.json.convert.JSONConverter; +import cn.hutool.json.serialize.JSONString; import java.io.Serializable; import java.time.temporal.TemporalAccessor; @@ -56,9 +57,17 @@ public class JSONConfig implements Serializable { */ private boolean checkDuplicate; /** - * 自定义的类型转换器,用于在序列化、反序列化操作中实现对象类型转换 + * 自定义的类型转换器,用于在getXXX操作中自动转换类型 */ private Converter converter = (type, value)->{ + if(null == value){ + return null; + } + if(value instanceof JSONString){ + // 被JSONString包装的对象,获取其原始类型 + value = ((JSONString) value).getRaw(); + } + final Class rawType = TypeUtil.getClass(type); if(null == rawType){ return value; @@ -67,12 +76,6 @@ public class JSONConfig implements Serializable { return JSONConverter.INSTANCE.toJSON(value); } if(Date.class.isAssignableFrom(rawType) || TemporalAccessor.class.isAssignableFrom(rawType)){ - // 用户指定了日期格式,获取日期属性时使用对应格式 - final String valueStr = Convert.convertWithCheck(String.class, value, null, isIgnoreError()); - if (null == valueStr) { - return null; - } - // 日期转换,支持自定义日期格式 final String format = getDateFormat(); if (StrUtil.isNotBlank(format)) { diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java index 0dab8cced..584619c40 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -130,6 +130,6 @@ public interface JSONGetter extends TypeGetter { return defaultValue; } - return (T) getConfig().getConverter().convert(type, value, defaultValue); + return get(key, type, getConfig().getConverter(), defaultValue); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java index 96748a5f9..a7badde32 100644 --- a/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java @@ -41,6 +41,9 @@ import java.util.Map; * @since 6.0.0 */ public class JSONConverter implements Converter { + /** + * 单例 + */ public static final JSONConverter INSTANCE = new JSONConverter(null); static { diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/DateJSONString.java b/hutool-json/src/main/java/cn/hutool/json/serialize/DateJSONString.java index de85eb3cb..3b67b80b4 100644 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/DateJSONString.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/DateJSONString.java @@ -1,8 +1,6 @@ package cn.hutool.json.serialize; import cn.hutool.core.convert.Convert; -import cn.hutool.core.convert.ConvertException; -import cn.hutool.core.convert.Converter; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.date.format.GlobalCustomFormat; @@ -10,7 +8,6 @@ import cn.hutool.core.text.StrUtil; import cn.hutool.json.InternalJSONUtil; import cn.hutool.json.JSONConfig; -import java.lang.reflect.Type; import java.time.MonthDay; import java.time.temporal.TemporalAccessor; import java.util.Calendar; @@ -23,7 +20,7 @@ import java.util.Date; * @author looly * @since 6.0.0 */ -public class DateJSONString implements JSONString, Converter { +public class DateJSONString implements JSONString { final Object dateObj; final JSONConfig jsonConfig; @@ -44,7 +41,8 @@ public class DateJSONString implements JSONString, Converter { * * @return 日期对象 */ - public Object getDateObj() { + @Override + public Object getRaw() { return this.dateObj; } @@ -58,11 +56,6 @@ public class DateJSONString implements JSONString, Converter { return formatDate(this.dateObj, this.jsonConfig.getDateFormat()); } - @Override - public Object convert(Type targetType, Object value) throws ConvertException { - return Convert.convert(targetType, this.dateObj); - } - /** * 按照给定格式格式化日期,格式为空时返回时间戳字符串
* 如果给定的格式是时间戳,直接返回时间戳字符串,如果是给定字符串格式,返回带双引号包装的字符串 diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java index f00b9a244..0b740ab4c 100644 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java @@ -7,6 +7,7 @@ package cn.hutool.json.serialize; * @author Looly * */ +@FunctionalInterface public interface JSONString { /** @@ -15,4 +16,13 @@ public interface JSONString { * @return JSON字符串 */ String toJSONString(); + + /** + * 获取原始的对象,默认为this + * + * @return 原始对象 + */ + default Object getRaw() { + return this; + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/TemporalAccessorSerializer.java b/hutool-json/src/main/java/cn/hutool/json/serialize/TemporalAccessorSerializer.java index 8695abb78..a8c7c9eaa 100755 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/TemporalAccessorSerializer.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/TemporalAccessorSerializer.java @@ -10,7 +10,12 @@ import java.time.LocalTime; import java.time.temporal.TemporalAccessor; /** - * {@link TemporalAccessor}的JSON自定义序列化实现 + * {@link TemporalAccessor}的JSON自定义序列化实现,支持包括:
+ *
    + *
  • LocalDate
  • + *
  • LocalDateTime
  • + *
  • LocalTime
  • + *
* * @author looly * @since 5.7.22 @@ -27,6 +32,11 @@ public class TemporalAccessorSerializer implements JSONSerializer temporalAccessorClass; + /** + * 构造 + * + * @param temporalAccessorClass TemporalAccessor实现类型 + */ public TemporalAccessorSerializer(final Class temporalAccessorClass) { this.temporalAccessorClass = temporalAccessorClass; }