diff --git a/CHANGELOG.md b/CHANGELOG.md index 4989e0187..663c45c01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.0 (2021-06-13) +# 5.7.0 (2021-06-15) ### 🐣新特性 * 【jwt 】 添加JWT模块,实现了JWT的创建、解析和验证 @@ -17,6 +17,7 @@ ### 🐞Bug修复 * 【db 】 修复count方法丢失参数问题(issue#I3VBSL@Gitee) * 【db 】 修复SpringUtil工具在`@PostConstruct` 注解标注的方法下失效问题(pr#341@Gitee) +* 【db 】 修复JSONUtil.parse方法未判断有序问题(issue#I3VHVY@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/OptionalBean.java b/hutool-core/src/main/java/cn/hutool/core/bean/OptionalBean.java index 9313b3b16..032be060b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/OptionalBean.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/OptionalBean.java @@ -10,7 +10,7 @@ import java.util.function.Supplier; /** * optional对象判空,参考:https://mp.weixin.qq.com/s/0c8iC0OTtx5LqPkhvkK0tw
- * from:https://github.com/looly/hutool/pull/1182 + * from:https://github.com/dromara/hutool/pull/1182 * * @param Bean类型 * @author totalo @@ -149,4 +149,4 @@ public final class OptionalBean { public int hashCode() { return Objects.hashCode(value); } -} \ No newline at end of file +} diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/OptionalBeanTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/OptionalBeanTest.java index 01a8312aa..38f5cc16a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/OptionalBeanTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/OptionalBeanTest.java @@ -13,7 +13,7 @@ public class OptionalBeanTest { String value1 = OptionalBean.ofNullable(user) .getBean(User::getSchool) .getBean(User.School::getAddress).get(); - Assert.assertNull(value1); + Assert.assertNull(value1); boolean present = OptionalBean.ofNullable(user) .getBean(User::getSchool) diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 8c7fa4818..8f4100c21 100644 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -16,7 +16,9 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.SortedMap; /** * 内部JSON工具类,仅用于JSON内部使用 @@ -198,7 +200,7 @@ final class InternalJSONUtil { * @return JSONObject */ protected static JSONObject propertyPut(JSONObject jsonObject, Object key, Object value) { - final String[] path = StrUtil.split(Convert.toStr(key), StrUtil.DOT); + final String[] path = StrUtil.splitToArray(Convert.toStr(key), CharUtil.DOT); int last = path.length - 1; JSONObject target = jsonObject; for (int i = 0; i < last; i += 1) { @@ -233,6 +235,31 @@ final class InternalJSONUtil { && (false == (obj instanceof Map)); } + /** + * 判断给定对象是否有序,用于辅助创建{@link JSONObject}时是否有序 + * + * + * + * @param value 被转换的对象 + * @return 是否有序 + * @since 5.7.0 + */ + protected static boolean isOrder(Object value){ + if(value instanceof LinkedHashMap || value instanceof SortedMap){ + return true; + } else if(value instanceof JSONGetter){ + final JSONConfig config = ((JSONGetter) value).getConfig(); + if(null != config){ + return config.isOrder(); + } + } + + return false; + } + /** * 按照给定格式格式化日期,格式为空时返回时间戳字符串 * diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 0258fa9fe..ae1d5c2fe 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -24,11 +24,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Enumeration; -import java.util.LinkedHashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; -import java.util.SortedMap; /** * JSON对象
@@ -158,7 +156,7 @@ public class JSONObject implements JSON, JSONGetter, Map * @since 3.0.9 */ public JSONObject(Object source, boolean ignoreNullValue) { - this(source, ignoreNullValue, (source instanceof LinkedHashMap) || (source instanceof SortedMap)); + this(source, ignoreNullValue, InternalJSONUtil.isOrder(source)); } /** @@ -653,7 +651,7 @@ public class JSONObject implements JSON, JSONGetter, Map return; } - if(ArrayUtil.isArray(source) || source instanceof JSONArray){ + if (ArrayUtil.isArray(source) || source instanceof JSONArray) { // 不支持集合类型转换为JSONObject throw new JSONException("Unsupported type [{}] to JSONObject!", source.getClass()); } @@ -663,7 +661,7 @@ public class JSONObject implements JSON, JSONGetter, Map for (final Entry e : ((Map) source).entrySet()) { this.set(Convert.toStr(e.getKey()), e.getValue()); } - }else if (source instanceof Map.Entry) { + } else if (source instanceof Map.Entry) { final Map.Entry entry = (Map.Entry) source; this.set(Convert.toStr(entry.getKey()), entry.getValue()); } else if (source instanceof CharSequence) { 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 971f7f49f..71450eb81 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -194,7 +194,15 @@ public class JSONUtil { * @return JSON */ public static JSON parse(Object obj) { - return parse(obj, JSONConfig.create()); + if(obj instanceof JSON){ + return (JSON) obj; + } + + final JSONConfig config = JSONConfig.create(); + if(InternalJSONUtil.isOrder(obj)){ + config.setOrder(true); + } + return parse(obj, config); } /** diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java index dd8abed24..159a4a49f 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java @@ -15,6 +15,8 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; public class JSONUtilTest { @@ -102,6 +104,20 @@ public class JSONUtilTest { Assert.assertEquals("{\"name\":\"123123\",\"value\":\"\\\\\",\"value2\":\" sortedMap = new TreeMap() { + private static final long serialVersionUID = 1L; + + { + put("attributes", "a"); + put("b", "b"); + put("c", "c"); + }}; + + Assert.assertEquals("{\"attributes\":\"a\",\"b\":\"b\",\"c\":\"c\"}", JSONUtil.toJsonStr(sortedMap)); + } + /** * 泛型多层嵌套测试 */ @@ -196,6 +212,8 @@ public class JSONUtilTest { final JSONObject jsonObject = JSONUtil.parseObj("{\n" + " \"test\": \"\\\\地库地库\",\n" + "}"); + + Assert.assertEquals("\\地库地库", jsonObject.getObj("test")); } @Test