This commit is contained in:
Looly
2022-02-13 22:51:58 +08:00
parent 0189de2dad
commit 0344982767
9 changed files with 172 additions and 8 deletions

View File

@@ -1,6 +1,9 @@
package cn.hutool.json;
import cn.hutool.core.comparator.CompareUtil;
import java.io.Serializable;
import java.util.Comparator;
/**
* JSON配置项
@@ -15,6 +18,10 @@ public class JSONConfig implements Serializable {
* 是否有序顺序按照加入顺序排序只针对JSONObject有效
*/
private boolean order;
/**
* 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序否则按照hash排序
*/
private Comparator<String> keyComparator;
/**
* 是否忽略转换过程中的异常
*/
@@ -70,6 +77,40 @@ public class JSONConfig implements Serializable {
return this;
}
/**
* 获取键排序规则<br>
* 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序否则按照hash排序
*
* @return 键排序规则
* @since 5.7.21
*/
public Comparator<String> getKeyComparator() {
return this.keyComparator;
}
/**
* 设置自然排序,即按照字母顺序排序
*
* @return this
* @since 5.7.21
*/
public JSONConfig setNatureKeyComparator() {
return setKeyComparator(CompareUtil.naturalComparator());
}
/**
* 设置键排序规则<br>
* 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序否则按照hash排序
*
* @param keyComparator 键排序规则
* @return this
* @since 5.7.21
*/
public JSONConfig setKeyComparator(Comparator<String> keyComparator) {
this.keyComparator = keyComparator;
return this;
}
/**
* 是否忽略转换过程中的异常
*

View File

@@ -10,6 +10,7 @@ import cn.hutool.core.lang.Filter;
import cn.hutool.core.lang.mutable.MutablePair;
import cn.hutool.core.map.CaseInsensitiveLinkedMap;
import cn.hutool.core.map.CaseInsensitiveMap;
import cn.hutool.core.map.CaseInsensitiveTreeMap;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -25,10 +26,12 @@ import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.TreeMap;
/**
* JSON对象<br>
@@ -121,9 +124,21 @@ public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object>
config = JSONConfig.create();
}
if (config.isIgnoreCase()) {
this.rawHashMap = config.isOrder() ? new CaseInsensitiveLinkedMap<>(capacity) : new CaseInsensitiveMap<>(capacity);
final Comparator<String> keyComparator = config.getKeyComparator();
if(null != keyComparator){
// 比较器存在情况下isOrder无效
this.rawHashMap = new CaseInsensitiveTreeMap<>(keyComparator);
}else{
this.rawHashMap = config.isOrder() ? new CaseInsensitiveLinkedMap<>(capacity) : new CaseInsensitiveMap<>(capacity);
}
} else {
this.rawHashMap = MapUtil.newHashMap(capacity, config.isOrder());
final Comparator<String> keyComparator = config.getKeyComparator();
if(null != keyComparator){
// 比较器存在情况下isOrder无效
this.rawHashMap = new TreeMap<>(keyComparator);
}else{
this.rawHashMap = MapUtil.newHashMap(capacity, config.isOrder());
}
}
this.config = config;
}
@@ -178,7 +193,8 @@ public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object>
public JSONObject(Object source, boolean ignoreNullValue, boolean isOrder) {
this(source, JSONConfig.create().setOrder(isOrder)//
.setIgnoreCase((source instanceof CaseInsensitiveMap))//
.setIgnoreNullValue(ignoreNullValue));
.setIgnoreNullValue(ignoreNullValue)
);
}
/**