diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 526d9e2b1..74c508e7d 100755 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -11,6 +11,7 @@ import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.convert.JSONConverter; import cn.hutool.json.serialize.JSONString; import java.math.BigDecimal; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSON.java b/hutool-json/src/main/java/cn/hutool/json/JSON.java index ca28fb17c..ce13eb351 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSON.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSON.java @@ -1,6 +1,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanPath; +import cn.hutool.json.convert.JSONConverter; import java.io.Serializable; import java.io.StringWriter; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java index ef7bc5d33..69e0886da 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -8,6 +8,7 @@ import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.lang.mutable.MutableObj; import cn.hutool.core.text.StrJoiner; import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.convert.JSONConverter; import cn.hutool.json.mapper.ArrayMapper; import cn.hutool.json.serialize.JSONWriter; 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 bbd8e82d3..0d614c4fa 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -3,6 +3,7 @@ package cn.hutool.json; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.lang.getter.OptNullBasicTypeFromObjectGetter; import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.convert.JSONConverter; import java.time.LocalDateTime; import java.util.Date; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 885f4e543..28df39714 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapWrapper; import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.convert.JSONConverter; import cn.hutool.json.mapper.ObjectMapper; import cn.hutool.json.serialize.JSONWriter; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java b/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java index 599e07b44..b4a3e7c2a 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java @@ -1,6 +1,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.convert.JSONConverter; import cn.hutool.json.serialize.JSONDeserializer; import cn.hutool.json.serialize.JSONString; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java similarity index 91% rename from hutool-json/src/main/java/cn/hutool/json/JSONConverter.java rename to hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java index 3a196cbe1..ecac366a9 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java @@ -1,7 +1,6 @@ -package cn.hutool.json; +package cn.hutool.json.convert; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.convert.Converter; import cn.hutool.core.convert.ConverterRegistry; @@ -12,6 +11,12 @@ import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.InternalJSONUtil; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONConfig; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import cn.hutool.json.serialize.GlobalSerializeMapping; import cn.hutool.json.serialize.JSONDeserializer; @@ -79,7 +84,7 @@ public class JSONConverter implements Converter { * @throws ConvertException 转换失败 */ @SuppressWarnings("unchecked") - protected static T jsonConvert(final Type targetType, final Object value, final JSONConfig config) throws ConvertException { + public static T jsonConvert(final Type targetType, final Object value, final JSONConfig config) throws ConvertException { if (null == value) { return null; } @@ -98,10 +103,6 @@ public class JSONConverter implements Converter { } return target.deserialize((JSON) value); } - } else if (targetClass == byte[].class && value instanceof CharSequence) { - // bytes二进制反序列化,默认按照Base64对待 - // issue#I59LW4 - return (T) Base64.decode((CharSequence) value); } else if (targetClass.isAssignableFrom(Date.class) || targetClass.isAssignableFrom(TemporalAccessor.class)) { // 用户指定了日期格式,获取日期属性时使用对应格式 final String valueStr = convertWithCheck(String.class, value, null, true); @@ -137,7 +138,7 @@ public class JSONConverter implements Converter { * @since 5.7.10 */ @SuppressWarnings("unchecked") - protected static T jsonToBean(final Type targetType, final Object value, final boolean ignoreError) throws ConvertException { + public static T jsonToBean(final Type targetType, final Object value, final boolean ignoreError) throws ConvertException { if (null == value) { return null; } diff --git a/hutool-json/src/main/java/cn/hutool/json/convert/JSONDeserializerConverter.java b/hutool-json/src/main/java/cn/hutool/json/convert/JSONDeserializerConverter.java new file mode 100644 index 000000000..6269bad2b --- /dev/null +++ b/hutool-json/src/main/java/cn/hutool/json/convert/JSONDeserializerConverter.java @@ -0,0 +1,31 @@ +package cn.hutool.json.convert; + +import cn.hutool.core.convert.AbstractConverter; +import cn.hutool.core.convert.ConvertException; +import cn.hutool.core.reflect.ConstructorUtil; +import cn.hutool.json.JSON; +import cn.hutool.json.serialize.JSONDeserializer; + +/** + * 实现了{@link JSONDeserializer}接口的Bean对象转换器,用于将指定JSON转换为JSONDeserializer子对象。 + * + * @author looly + * @since 6.0.0 + */ +public class JSONDeserializerConverter extends AbstractConverter { + private static final long serialVersionUID = 1L; + + @Override + protected Object convertInternal(Class targetClass, Object value) { + // 自定义反序列化 + if (value instanceof JSON) { + final JSONDeserializer target = (JSONDeserializer) ConstructorUtil.newInstanceIfPossible(targetClass); + if (null == target) { + throw new ConvertException("Can not instance target: [{}]", targetClass); + } + return target.deserialize((JSON) value); + } + + throw new ConvertException("JSONDeserializer bean must be convert from JSON!"); + } +}