diff --git a/CHANGELOG.md b/CHANGELOG.md index 12e542bc9..ed474c52c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ * 【cache】 修复missCount规则(issue#465@Github) * 【core】 修复父目录拷贝到子目录导致的递归问题 * 【crypto】 修复RSA中分段加密计算导致的异常(issue#481@Github) +* 【json】 修复TypeReference传入Type类型参数导致的异常(issue#488@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java index 2bb90dd11..bfd0d2e71 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java @@ -51,6 +51,7 @@ import cn.hutool.core.convert.impl.URIConverter; import cn.hutool.core.convert.impl.URLConverter; import cn.hutool.core.convert.impl.UUIDConverter; import cn.hutool.core.date.DateTime; +import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; @@ -199,6 +200,10 @@ public class ConverterRegistry implements Serializable{ type = defaultValue.getClass(); } + if(type instanceof TypeReference) { + type = ((TypeReference)type).getType(); + } + // 标准转换器 final Converter converter = getConverter(type, isCustomFirst); if (null != converter) { diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 617585eed..c452b86c5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -7,6 +7,7 @@ import org.junit.Assert; import org.junit.Test; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Console; /** * 类型转换工具单元测试 @@ -26,13 +27,15 @@ public class ConvertTest { public void toStrTest() { int a = 1; long[] b = { 1, 2, 3, 4, 5 }; + + Console.log(Convert.convert(String.class, b)); String aStr = Convert.toStr(a); Assert.assertEquals("1", aStr); String bStr = Convert.toStr(b); Assert.assertEquals("[1, 2, 3, 4, 5]", Convert.toStr(bStr)); } - + @Test public void toStrTest2() { String result = Convert.convert(String.class, "aaaa"); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index d908c4bcd..1dd94e1a0 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -16,6 +16,7 @@ import java.util.ResourceBundle; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.HexUtil; import cn.hutool.core.util.ObjectUtil; @@ -342,6 +343,19 @@ public final class JSONUtil { public static T toBean(JSONObject json, Class beanClass) { return null == json ? null : json.toBean(beanClass); } + + /** + * JSON字符串转为实体类对象,转换异常将被抛出 + * + * @param Bean类型 + * @param jsonString JSON字符串 + * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型 + * @return 实体类对象 + * @since 4.3.2 + */ + public static T toBean(String jsonString, TypeReference typeReference, boolean ignoreError) { + return toBean(jsonString, typeReference.getType(), ignoreError); + } /** * JSON字符串转为实体类对象,转换异常将被抛出 @@ -355,6 +369,20 @@ public final class JSONUtil { public static T toBean(String jsonString, Type beanType, boolean ignoreError) { return toBean(parseObj(jsonString), beanType, ignoreError); } + + /** + * 转为实体类对象 + * + * @param Bean类型 + * @param json JSONObject + * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型 + * @param ignoreError 是否忽略转换错误 + * @return 实体类对象 + * @since 4.6.2 + */ + public static T toBean(JSONObject json, TypeReference typeReference, boolean ignoreError) { + return toBean(json, typeReference.getType(), ignoreError); + } /** * 转为实体类对象 diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java new file mode 100644 index 000000000..78887a4f8 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java @@ -0,0 +1,45 @@ +package cn.hutool.json; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; + +public class Issue488Test { + + @Test + public void toBeanTest() { + String jsonStr = ResourceUtil.readUtf8Str("issue488.json"); + + ResultSuccess> result = JSONUtil.toBean(jsonStr, + new TypeReference>>() {}, false); + + Assert.assertEquals("https://graph.microsoft.com/beta/$metadata#Collection(microsoft.graph.emailAddress)", result.getContext()); + + List adds = result.getValue(); + Assert.assertEquals("会议室101", adds.get(0).getName()); + Assert.assertEquals("MeetingRoom101@abc.com", adds.get(0).getAddress()); + Assert.assertEquals("会议室102", adds.get(1).getName()); + Assert.assertEquals("MeetingRoom102@abc.com", adds.get(1).getAddress()); + Assert.assertEquals("会议室103", adds.get(2).getName()); + Assert.assertEquals("MeetingRoom103@abc.com", adds.get(2).getAddress()); + Assert.assertEquals("会议室219", adds.get(3).getName()); + Assert.assertEquals("MeetingRoom219@abc.com", adds.get(3).getAddress()); + } + + @Data + public class ResultSuccess { + private String context; + private T value; + } + + @Data + public class EmailAddress { + private String name; + private String address; + } +} diff --git a/hutool-json/src/test/resources/issue488.json b/hutool-json/src/test/resources/issue488.json new file mode 100644 index 000000000..9857ecd8d --- /dev/null +++ b/hutool-json/src/test/resources/issue488.json @@ -0,0 +1,16 @@ +{ + "context": "https://graph.microsoft.com/beta/$metadata#Collection(microsoft.graph.emailAddress)", + "value": [{ + "name": "\u4f1a\u8bae\u5ba4101", + "address": "MeetingRoom101@abc.com" + }, { + "name": "\u4f1a\u8bae\u5ba4102", + "address": "MeetingRoom102@abc.com" + }, { + "name": "\u4f1a\u8bae\u5ba4103", + "address": "MeetingRoom103@abc.com" + }, { + "name": "\u4f1a\u8bae\u5ba4219", + "address": "MeetingRoom219@abc.com" + }] +} \ No newline at end of file