This commit is contained in:
Looly 2022-09-30 22:36:20 +08:00
parent 5f61405464
commit 00fad42926
10 changed files with 64 additions and 23 deletions

View File

@ -18,7 +18,7 @@ public interface Converter {
* 如果类型无法确定将读取默认值的类型做为目标类型 * 如果类型无法确定将读取默认值的类型做为目标类型
* *
* @param targetType 目标Type非泛型类使用 * @param targetType 目标Type非泛型类使用
* @param value 原始值 * @param value 原始值如果对象实现了此接口则value为this
* @return 转换后的值 * @return 转换后的值
* @throws ConvertException 转换无法正常完成或转换异常时抛出此异常 * @throws ConvertException 转换无法正常完成或转换异常时抛出此异常
*/ */

View File

@ -30,6 +30,9 @@ import java.util.Map;
public class BeanConverter implements Converter, Serializable { public class BeanConverter implements Converter, Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 单例对象
*/
public static BeanConverter INSTANCE = new BeanConverter(); public static BeanConverter INSTANCE = new BeanConverter();
private final CopyOptions copyOptions; private final CopyOptions copyOptions;
@ -51,7 +54,7 @@ public class BeanConverter implements Converter, Serializable {
} }
@Override @Override
public Object convert(Type targetType, Object value) throws ConvertException { public Object convert(final Type targetType, final Object value) throws ConvertException {
Assert.notNull(targetType); Assert.notNull(targetType);
if (null == value) { if (null == value) {
return null; return null;
@ -62,7 +65,7 @@ public class BeanConverter implements Converter, Serializable {
return ((Converter) value).convert(targetType, value); 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!"); Assert.notNull(targetClass, "Target type is not a class!");
return convertInternal(targetType, targetClass, value); return convertInternal(targetType, targetClass, value);

View File

@ -17,6 +17,9 @@ import java.util.Calendar;
public class DateConverter extends AbstractConverter { public class DateConverter extends AbstractConverter {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 单例
*/
public static final DateConverter INSTANCE = new DateConverter(); public static final DateConverter INSTANCE = new DateConverter();
/** /**

View File

@ -1,6 +1,8 @@
package cn.hutool.core.lang.getter; package cn.hutool.core.lang.getter;
import cn.hutool.core.convert.CompositeConverter;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.Converter;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -89,7 +91,21 @@ public interface TypeGetter<K> {
* @return 结果值 * @return 结果值
*/ */
default <T> T get(final K key, final Type type, final T defaultValue) { default <T> 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 <T> 目标类型
* @param key
* @param type 目标类型
* @param converter 自定义转换器
* @param defaultValue 默认值
* @return 结果值
*/
default <T> T get(final K key, final Type type, final Converter converter, final T defaultValue) {
return converter.convert(type, getObj(key), defaultValue);
} }
/** /**

View File

@ -8,6 +8,7 @@ import cn.hutool.core.convert.impl.TemporalAccessorConverter;
import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.reflect.TypeUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.json.convert.JSONConverter; import cn.hutool.json.convert.JSONConverter;
import cn.hutool.json.serialize.JSONString;
import java.io.Serializable; import java.io.Serializable;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
@ -56,9 +57,17 @@ public class JSONConfig implements Serializable {
*/ */
private boolean checkDuplicate; private boolean checkDuplicate;
/** /**
* 自定义的类型转换器用于在序列化反序列化操作中实现对象类型转换 * 自定义的类型转换器用于在getXXX操作中自动转换类型
*/ */
private Converter converter = (type, value)->{ 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); final Class<?> rawType = TypeUtil.getClass(type);
if(null == rawType){ if(null == rawType){
return value; return value;
@ -67,12 +76,6 @@ public class JSONConfig implements Serializable {
return JSONConverter.INSTANCE.toJSON(value); return JSONConverter.INSTANCE.toJSON(value);
} }
if(Date.class.isAssignableFrom(rawType) || TemporalAccessor.class.isAssignableFrom(rawType)){ 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(); final String format = getDateFormat();
if (StrUtil.isNotBlank(format)) { if (StrUtil.isNotBlank(format)) {

View File

@ -130,6 +130,6 @@ public interface JSONGetter<K> extends TypeGetter<K> {
return defaultValue; return defaultValue;
} }
return (T) getConfig().getConverter().convert(type, value, defaultValue); return get(key, type, getConfig().getConverter(), defaultValue);
} }
} }

View File

@ -41,6 +41,9 @@ import java.util.Map;
* @since 6.0.0 * @since 6.0.0
*/ */
public class JSONConverter implements Converter { public class JSONConverter implements Converter {
/**
* 单例
*/
public static final JSONConverter INSTANCE = new JSONConverter(null); public static final JSONConverter INSTANCE = new JSONConverter(null);
static { static {

View File

@ -1,8 +1,6 @@
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.ConvertException;
import cn.hutool.core.convert.Converter;
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;
@ -10,7 +8,6 @@ import cn.hutool.core.text.StrUtil;
import cn.hutool.json.InternalJSONUtil; import cn.hutool.json.InternalJSONUtil;
import cn.hutool.json.JSONConfig; import cn.hutool.json.JSONConfig;
import java.lang.reflect.Type;
import java.time.MonthDay; import java.time.MonthDay;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
import java.util.Calendar; import java.util.Calendar;
@ -23,7 +20,7 @@ import java.util.Date;
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public class DateJSONString implements JSONString, Converter { public class DateJSONString implements JSONString {
final Object dateObj; final Object dateObj;
final JSONConfig jsonConfig; final JSONConfig jsonConfig;
@ -44,7 +41,8 @@ public class DateJSONString implements JSONString, Converter {
* *
* @return 日期对象 * @return 日期对象
*/ */
public Object getDateObj() { @Override
public Object getRaw() {
return this.dateObj; return this.dateObj;
} }
@ -58,11 +56,6 @@ public class DateJSONString implements JSONString, Converter {
return formatDate(this.dateObj, this.jsonConfig.getDateFormat()); return formatDate(this.dateObj, this.jsonConfig.getDateFormat());
} }
@Override
public Object convert(Type targetType, Object value) throws ConvertException {
return Convert.convert(targetType, this.dateObj);
}
/** /**
* 按照给定格式格式化日期格式为空时返回时间戳字符串<br> * 按照给定格式格式化日期格式为空时返回时间戳字符串<br>
* 如果给定的格式是时间戳直接返回时间戳字符串如果是给定字符串格式返回带双引号包装的字符串 * 如果给定的格式是时间戳直接返回时间戳字符串如果是给定字符串格式返回带双引号包装的字符串

View File

@ -7,6 +7,7 @@ package cn.hutool.json.serialize;
* @author Looly * @author Looly
* *
*/ */
@FunctionalInterface
public interface JSONString { public interface JSONString {
/** /**
@ -15,4 +16,13 @@ public interface JSONString {
* @return JSON字符串 * @return JSON字符串
*/ */
String toJSONString(); String toJSONString();
/**
* 获取原始的对象默认为this
*
* @return 原始对象
*/
default Object getRaw() {
return this;
}
} }

View File

@ -10,7 +10,12 @@ import java.time.LocalTime;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
/** /**
* {@link TemporalAccessor}的JSON自定义序列化实现 * {@link TemporalAccessor}的JSON自定义序列化实现支持包括<br>
* <ul>
* <li>LocalDate</li>
* <li>LocalDateTime</li>
* <li>LocalTime</li>
* </ul>
* *
* @author looly * @author looly
* @since 5.7.22 * @since 5.7.22
@ -27,6 +32,11 @@ public class TemporalAccessorSerializer implements JSONSerializer<JSONObject, Te
private final Class<? extends TemporalAccessor> temporalAccessorClass; private final Class<? extends TemporalAccessor> temporalAccessorClass;
/**
* 构造
*
* @param temporalAccessorClass TemporalAccessor实现类型
*/
public TemporalAccessorSerializer(final Class<? extends TemporalAccessor> temporalAccessorClass) { public TemporalAccessorSerializer(final Class<? extends TemporalAccessor> temporalAccessorClass) {
this.temporalAccessorClass = temporalAccessorClass; this.temporalAccessorClass = temporalAccessorClass;
} }