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}时是否有序
+ *
+ *
+ * - 对象为{@link LinkedHashMap}子类或{@link LinkedHashMap}子类
+ * - 对象实现
+ *
+ *
+ * @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\":\"\"}", json2.get("user"));
}
+ @Test
+ public void toJsonStrFromSortedTest() {
+ SortedMap