From afc4b2b2137362b7d63318a4ea5e8ba3cad30207 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 22 Aug 2021 16:06:00 +0800 Subject: [PATCH] fix bug --- CHANGELOG.md | 3 +- .../java/cn/hutool/json/JSONConverter.java | 25 +++++++++++-- .../main/java/cn/hutool/json/JSONSupport.java | 2 +- .../java/cn/hutool/json/JSONSupportTest.java | 37 +++++++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f4331140..c1586f8cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.10 (2021-08-19) +# 5.7.10 (2021-08-22) ### 🐣新特性 * 【core 】 增加NamingCase类 @@ -18,6 +18,7 @@ * 【core 】 修复MapUtil.sort比较器不一致返回原map的问题(issue#I46AQJ@Gitee) ### 🐞Bug修复 +* 【core 】 修复JSONSupport默认循环引用导致的问题(issue#1779@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index 222f7a9a4..b7f61773a 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -85,10 +85,30 @@ public class JSONConverter implements Converter { } } - if(value instanceof JSON) { + return jsonToBean(targetType, value, ignoreError); + } + + /** + * JSON递归转换
+ * 首先尝试JDK类型转换,如果失败尝试JSON转Bean + * + * @param 转换后的对象类型 + * @param targetType 目标类型 + * @param value 值,JSON格式 + * @param ignoreError 是否忽略转换错误 + * @return 目标类型的值 + * @throws ConvertException 转换失败 + */ + protected static T jsonToBean(Type targetType, Object value, boolean ignoreError) throws ConvertException { + if (JSONUtil.isNull(value)) { + return null; + } + + if(value instanceof JSON){ final JSONDeserializer deserializer = GlobalSerializeMapping.getDeserializer(targetType); if(null != deserializer) { - return (T) deserializer.deserialize((JSON)value); + //noinspection unchecked + return (T) deserializer.deserialize((JSON) value); } } @@ -111,5 +131,4 @@ public class JSONConverter implements Converter { public JSON convert(Object value, JSON defaultValue) throws IllegalArgumentException { return JSONUtil.parse(value); } - } 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 be4197dcd..d971e49b4 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONSupport.java @@ -26,7 +26,7 @@ public class JSONSupport implements JSONString, JSONBeanParser { */ @Override public void parse(JSON json) { - final JSONSupport support = json.toBean(this.getClass()); + final JSONSupport support = JSONConverter.jsonToBean(getClass(), json, false); BeanUtil.copyProperties(support, this); } diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java new file mode 100644 index 000000000..95dda69fa --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java @@ -0,0 +1,37 @@ +package cn.hutool.json; + +import cn.hutool.core.lang.Console; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.junit.Test; + +public class JSONSupportTest { + + @Test + public void parseTest() { + String jsonstr = "{\n" + + " \"location\": \"http://www.bejson.com\",\n" + + " \"message\": \"这是一条测试消息\",\n" + + " \"requestId\": \"123456789\",\n" + + " \"traceId\": \"987654321\"\n" + + "}"; + + + final TestBean testBean = JSONUtil.toBean(jsonstr, TestBean.class); + Console.log(testBean); + } + + @EqualsAndHashCode(callSuper = true) + @Data + static class TestBean extends JSONSupport{ + + private String location; + + private String message; + + private String requestId; + + private String traceId; + + } +}