diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a55a707a..c017b8aaf 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ * 【jwt 】 修复JWTSignerUtil中ES256签名不符合规范问题(issue#3205@Github) * 【core 】 修复UserInfo获取country问题(issue#I7MCKW@Gitee) * 【extra 】 修复MVEL加载错误问题(issue#3214@Github) +* 【json 】 修复JSONBeanParser在遇到List时没有被正确递归问题(issue#I7M2GZ@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.20(2023-06-16) 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 10263d2bd..4dc10e568 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 @@ -6,6 +6,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.convert.ConvertException; +import cn.hutool.core.lang.Console; import cn.hutool.core.map.MapProxy; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; @@ -67,6 +68,16 @@ public class BeanConverter extends AbstractConverter { @Override protected T convertInternal(Object value) { + final Class[] interfaces = this.beanClass.getInterfaces(); + for (Class anInterface : interfaces) { + if("cn.hutool.json.JSONBeanParser".equals(anInterface.getName())){ + // issue#I7M2GZ + final T obj = ReflectUtil.newInstanceIfPossible(this.beanClass); + ReflectUtil.invoke(obj, "parse", value); + return obj; + } + } + if(value instanceof Map || value instanceof ValueProvider || BeanUtil.isBean(value.getClass())) { diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI7M2GZTest.java b/hutool-json/src/test/java/cn/hutool/json/IssueI7M2GZTest.java new file mode 100644 index 000000000..3a0e2190e --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI7M2GZTest.java @@ -0,0 +1,51 @@ +package cn.hutool.json; + +import cn.hutool.core.lang.TypeReference; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * https://gitee.com/dromara/hutool/issues/I7M2GZ + */ +public class IssueI7M2GZTest { + + @Data + @AllArgsConstructor + public static class JSONBeanParserImpl implements JSONBeanParser { + private String name; + private Integer parsed; + + @Override + public void parse(final Object object) { + setName("new Object"); + setParsed(12); + } + } + + @Data + public static class MyEntity { + private List list; + } + + @Test + public void toListTest() { + final List list = new ArrayList<>(); + list.add(new JSONBeanParserImpl("Object1", 1)); + + final MyEntity entity = new MyEntity<>(); + entity.setList(list); + + final String json = JSONUtil.toJsonStr(entity); + //Console.log(json); + final MyEntity result = JSONUtil.toBean(json, new TypeReference>() { + }, false); + Assert.assertEquals("new Object", result.getList().get(0).getName()); + Assert.assertNotNull(result.getList().get(0).getParsed()); + Assert.assertEquals(Integer.valueOf(12), result.getList().get(0).getParsed()); + } +} diff --git a/hutool-json/src/test/java/cn/hutool/json/issueI7M2GZTest.java b/hutool-json/src/test/java/cn/hutool/json/issueI7M2GZTest.java deleted file mode 100644 index 73a578784..000000000 --- a/hutool-json/src/test/java/cn/hutool/json/issueI7M2GZTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.hutool.json; - -import cn.hutool.core.lang.TypeReference; -import org.junit.Assert; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * https://gitee.com/dromara/hutool/issues/I7M2GZ - */ -public class issueI7M2GZTest { - - public static class JSONBeanParserImpl implements JSONBeanParser { - private String name; - private Boolean isParsed; - - public Boolean getParsed() { - return isParsed; - } - - public void setParsed(Boolean parsed) { - isParsed = parsed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public JSONBeanParserImpl() { - } - - public JSONBeanParserImpl(String name) { - this.name = name; - } - - @Override - public void parse(Object object) { - setParsed(true); - } - } - - public static class MyEntity { - private List list; - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - } - - @Test - public void toListTest() { - List list = new ArrayList<>(); - list.add(new JSONBeanParserImpl("Object1")); - - MyEntity entity = new MyEntity<>(); - entity.setList(list); - String json = JSONUtil.toJsonStr(entity); - MyEntity result = JSONUtil.toBean(json, new TypeReference>() { - }, false); - Assert.assertEquals("Object1", result.getList().get(0).getName()); - Assert.assertNotNull(result.getList().get(0).getParsed()); - } -}