From d58cda4ff7783c7f7ffcb448b40e1bb4394d239d Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 22 Aug 2021 16:22:26 +0800 Subject: [PATCH] fix bug --- .../main/java/cn/hutool/json/JSONConverter.java | 4 +++- .../test/java/cn/hutool/json/JSONSupportTest.java | 14 +++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) 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 b7f61773a..7f5ef5ced 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -56,7 +56,8 @@ public class JSONConverter implements Converter { /** * JSON递归转换
- * 首先尝试JDK类型转换,如果失败尝试JSON转Bean + * 首先尝试JDK类型转换,如果失败尝试JSON转Bean
+ * 如果遇到{@link JSONBeanParser},则调用其{@link JSONBeanParser#parse(Object)}方法转换。 * * @param 转换后的对象类型 * @param targetType 目标类型 @@ -98,6 +99,7 @@ public class JSONConverter implements Converter { * @param ignoreError 是否忽略转换错误 * @return 目标类型的值 * @throws ConvertException 转换失败 + * @since 5.7.10 */ protected static T jsonToBean(Type targetType, Object value, boolean ignoreError) throws ConvertException { if (JSONUtil.isNull(value)) { diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java index 95dda69fa..92d1e8e9f 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONSupportTest.java @@ -1,16 +1,21 @@ package cn.hutool.json; -import cn.hutool.core.lang.Console; import lombok.Data; import lombok.EqualsAndHashCode; +import org.junit.Assert; import org.junit.Test; public class JSONSupportTest { + /** + * https://github.com/dromara/hutool/issues/1779 + * 在JSONSupport的JSONBeanParse中,如果使用json.toBean,会导致JSONBeanParse.parse方法反复递归调用,最终栈溢出
+ * 因此parse方法默认实现必须避开JSONBeanParse.parse调用。 + */ @Test public void parseTest() { String jsonstr = "{\n" + - " \"location\": \"http://www.bejson.com\",\n" + + " \"location\": \"https://hutool.cn\",\n" + " \"message\": \"这是一条测试消息\",\n" + " \"requestId\": \"123456789\",\n" + " \"traceId\": \"987654321\"\n" + @@ -18,7 +23,10 @@ public class JSONSupportTest { final TestBean testBean = JSONUtil.toBean(jsonstr, TestBean.class); - Console.log(testBean); + Assert.assertEquals("https://hutool.cn", testBean.getLocation()); + Assert.assertEquals("这是一条测试消息", testBean.getMessage()); + Assert.assertEquals("123456789", testBean.getRequestId()); + Assert.assertEquals("987654321", testBean.getTraceId()); } @EqualsAndHashCode(callSuper = true)