mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
add sort
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否忽略转换过程中的异常
|
||||
*
|
||||
|
@@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user