fix parse bug

This commit is contained in:
Looly 2021-06-15 10:17:35 +08:00
parent 878c0169ea
commit 395942298e
7 changed files with 63 additions and 11 deletions

View File

@ -3,7 +3,7 @@
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.7.0 (2021-06-13) # 5.7.0 (2021-06-15)
### 🐣新特性 ### 🐣新特性
* 【jwt 】 添加JWT模块实现了JWT的创建、解析和验证 * 【jwt 】 添加JWT模块实现了JWT的创建、解析和验证
@ -17,6 +17,7 @@
### 🐞Bug修复 ### 🐞Bug修复
* 【db 】 修复count方法丢失参数问题(issue#I3VBSL@Gitee) * 【db 】 修复count方法丢失参数问题(issue#I3VBSL@Gitee)
* 【db 】 修复SpringUtil工具在`@PostConstruct` 注解标注的方法下失效问题(pr#341@Gitee) * 【db 】 修复SpringUtil工具在`@PostConstruct` 注解标注的方法下失效问题(pr#341@Gitee)
* 【db 】 修复JSONUtil.parse方法未判断有序问题(issue#I3VHVY@Gitee)
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -10,7 +10,7 @@ import java.util.function.Supplier;
/** /**
* optional对象判空参考https://mp.weixin.qq.com/s/0c8iC0OTtx5LqPkhvkK0tw<br> * optional对象判空参考https://mp.weixin.qq.com/s/0c8iC0OTtx5LqPkhvkK0tw<br>
* fromhttps://github.com/looly/hutool/pull/1182 * fromhttps://github.com/dromara/hutool/pull/1182
* *
* @param <T> Bean类型 * @param <T> Bean类型
* @author totalo * @author totalo

View File

@ -16,7 +16,9 @@ import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.SortedMap;
/** /**
* 内部JSON工具类仅用于JSON内部使用 * 内部JSON工具类仅用于JSON内部使用
@ -198,7 +200,7 @@ final class InternalJSONUtil {
* @return JSONObject * @return JSONObject
*/ */
protected static JSONObject propertyPut(JSONObject jsonObject, Object key, Object value) { 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; int last = path.length - 1;
JSONObject target = jsonObject; JSONObject target = jsonObject;
for (int i = 0; i < last; i += 1) { for (int i = 0; i < last; i += 1) {
@ -233,6 +235,31 @@ final class InternalJSONUtil {
&& (false == (obj instanceof Map)); && (false == (obj instanceof Map));
} }
/**
* 判断给定对象是否有序用于辅助创建{@link JSONObject}时是否有序
*
* <ul>
* <li>对象为{@link LinkedHashMap}子类或{@link LinkedHashMap}子类</li>
* <li>对象实现</li>
* </ul>
*
* @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;
}
/** /**
* 按照给定格式格式化日期格式为空时返回时间戳字符串 * 按照给定格式格式化日期格式为空时返回时间戳字符串
* *

View File

@ -24,11 +24,9 @@ import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Collection; import java.util.Collection;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Set; import java.util.Set;
import java.util.SortedMap;
/** /**
* JSON对象<br> * JSON对象<br>
@ -158,7 +156,7 @@ public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object>
* @since 3.0.9 * @since 3.0.9
*/ */
public JSONObject(Object source, boolean ignoreNullValue) { public JSONObject(Object source, boolean ignoreNullValue) {
this(source, ignoreNullValue, (source instanceof LinkedHashMap) || (source instanceof SortedMap)); this(source, ignoreNullValue, InternalJSONUtil.isOrder(source));
} }
/** /**

View File

@ -194,7 +194,15 @@ public class JSONUtil {
* @return JSON * @return JSON
*/ */
public static JSON parse(Object obj) { 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);
} }
/** /**

View File

@ -15,6 +15,8 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
public class JSONUtilTest { public class JSONUtilTest {
@ -102,6 +104,20 @@ public class JSONUtilTest {
Assert.assertEquals("{\"name\":\"123123\",\"value\":\"\\\\\",\"value2\":\"</\"}", json2.get("user")); Assert.assertEquals("{\"name\":\"123123\",\"value\":\"\\\\\",\"value2\":\"</\"}", json2.get("user"));
} }
@Test
public void toJsonStrFromSortedTest() {
SortedMap<Object, Object> sortedMap = new TreeMap<Object, Object>() {
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" + final JSONObject jsonObject = JSONUtil.parseObj("{\n" +
" \"test\": \"\\\\地库地库\",\n" + " \"test\": \"\\\\地库地库\",\n" +
"}"); "}");
Assert.assertEquals("\\地库地库", jsonObject.getObj("test"));
} }
@Test @Test