From 7a30dff976e7fbae88f5595c50462894311c53e0 Mon Sep 17 00:00:00 2001 From: zhoupeng Date: Mon, 7 Aug 2023 18:54:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=A0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=8F=8D=E5=B0=84=E8=AF=BB=E5=8F=96JSON=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=B1=BB=E5=9E=8B=E5=AF=BC=E8=87=B4=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=B8=8B=E9=99=8D=E4=B8=BA=E5=8E=9F=E6=9D=A51/3=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20by=20SHA-1:=205b2d2050d2251c735c9bb41aebd4?= =?UTF-8?q?0b632fd1d33f?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/bean/copier/CopyOptions.java | 7 ++---- .../core/bean/copier/IJSONTypeConverter.java | 23 +++++++++++++++++++ .../src/main/java/cn/hutool/json/JSON.java | 5 ++-- 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java 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 8ec09389f..0c1d6ef87 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 @@ -8,7 +8,6 @@ import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; import java.io.Serializable; import java.lang.reflect.Field; @@ -83,10 +82,8 @@ public class CopyOptions implements Serializable { return null; } - final String name = value.getClass().getName(); - if(ArrayUtil.contains(new String[]{"cn.hutool.json.JSONObject", "cn.hutool.json.JSONArray"}, name)){ - // 由于设计缺陷导致JSON转Bean时无法使用自定义的反序列化器,此处采用反射方式修复bug,此类问题会在6.x解决 - return ReflectUtil.invoke(value, "toBean", ObjectUtil.defaultIfNull(type, Object.class)); + if(value instanceof IJSONTypeConverter) { + return ((IJSONTypeConverter)value).toBean(ObjectUtil.defaultIfNull(type, Object.class)); } return Convert.convertWithCheck(type, value, null, ignoreError); diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java new file mode 100644 index 000000000..628231f28 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/IJSONTypeConverter.java @@ -0,0 +1,23 @@ +package cn.hutool.core.bean.copier; + +import java.lang.reflect.Type; + +/** + * JSON自定义转换扩展接口,因core模块无法直接调用json模块而创建, + * 使用此接口避免使用反射调用toBean方法而性能太差。 + * + * @author mkeq + */ +public interface IJSONTypeConverter { + + /** + * 转为实体类对象 + * + * @param Bean类型 + * @param type {@link Type} + * @return 实体类对象 + * @since 3.0.8 + */ + T toBean(Type type); + +} 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 2af783ccd..84eb35c5e 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.core.bean.copier.IJSONTypeConverter; import cn.hutool.core.lang.TypeReference; import java.io.Serializable; @@ -13,7 +14,7 @@ import java.lang.reflect.Type; * * @author Looly */ -public interface JSON extends Cloneable, Serializable { +public interface JSON extends Cloneable, Serializable, IJSONTypeConverter { /** * 获取JSON配置 @@ -177,7 +178,7 @@ public interface JSON extends Cloneable, Serializable { * @since 3.0.8 */ default T toBean(Type type) { - return JSONConverter.jsonConvert(type, this, getConfig()); + return toBean(type, getConfig().isIgnoreError()); } /**