인터페이스에 서명하고 일반 텍스트 문자열을 접합할 때 대부분의 사람들은 입력 매개변수를 알파벳 순서로 정렬해야 한다는 데 동의하여 json 재정렬 방법을 작성했습니다. 핵심 아이디어는 json의 내장 변환 문자열을 사용하여 정렬하고 JSONObject.toJSONString(json, SerializerFeature.MapSortField)
마지막으로 다시 json으로 변환하는 것입니다.
정렬 도구
package com.yulisao.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;
/**
* JSON 排序
* author yulisao
* createDate 2023/4/14
*/
public class JsonSortUtils {
public static void main(String[] args) {
JSONObject json = new JSONObject();
//JSONObject json = new JSONObject(new LinkedHashMap<>());
json.put("bb", "23");
json.put("aa", "zhang");
json.put("cc", "13122223333");
System.out.println("sort before is " + json);
// 若json只有一层
//String sortStr = JSONObject.toJSONString(json, SerializerFeature.MapSortField);
// 若json有多层,且里面层的也需要进行排序 通用一些
String sortStr = getMapSortObjectJson(json);
JSONObject sortJson = JSONObject.parseObject(sortStr);
System.out.println("sort after is " + sortJson);
}
/**
* JSONObject转换为排序后的字符串
*
* @param jsonObject
* @return
*/
private static String getMapSortObjectJson(JSONObject jsonObject) {
if (null == jsonObject) {
return "";
}
Set<String> keySet = jsonObject.keySet();
Iterator<String> keys = keySet.iterator();
while (keys.hasNext()) {
String key = keys.next();
String value = jsonObject.getString(key);
// 非 JSONArray、 JSONObject 则跳过
if (!JSONObject.isValid(value)) {
continue;
}
Object object = JSONObject.parse(value);
if (null != object && object instanceof JSONObject) {
JSONObject valueJsonObject = JSONObject.parseObject(value);
String jsonValue = getMapSortObjectJson(valueJsonObject);
jsonObject.fluentPut(key, JSONObject.parseObject(jsonValue));
}
if (null != object && object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(value);
String jsonValue = getMapSortArrayJson(jsonArray);
jsonObject.fluentPut(key, JSONArray.parseArray(jsonValue));
}
}
return JSONObject.toJSONString(jsonObject, SerializerFeature.MapSortField);
}
/**
* JSONArray转换为排序后的字符串
*
* @param jsonArray
* @return
*/
private static String getMapSortArrayJson(JSONArray jsonArray) {
JSONArray resultArray = new JSONArray();
for (int index = 0; index < jsonArray.size(); index++) {
// 里面的对象转化为JSONObject
String value = jsonArray.getString(index);
if (JSONObject.isValid(value)) {
resultArray.add(JSONObject.parse(getMapSortFieldJson(value)));
continue;
}
resultArray.add(value);
}
return JSONArray.toJSONString(resultArray, SerializerFeature.MapSortField);
}
/**
* JSON字符串排序
*
* @param json 原JSON字符串
* @return 排序后的JSON字符串
*/
public static String getMapSortFieldJson(String json) {
if (StringUtils.isEmpty(json)) {
return json;
}
Object object = JSONObject.parse(json);
if (null != object && object instanceof JSONObject) {
JSONObject jsonObject = JSONObject.parseObject(json);
json = getMapSortObjectJson(jsonObject);
}
if (null != object && object instanceof JSONArray) {
JSONArray jsonArray = JSONArray.parseArray(json);
json = getMapSortArrayJson(jsonArray);
}
return json;
}
}
연산 결과
sort before is {
"bb":"23","aa":"zhang","cc":"13122223333"}
sort after is {
"aa":"zhang","bb":"23","cc":"13122223333"}
기타 참고 사항
JSONObject의 맨 아래 레이어는 Map 구조이며 기본값은 HashMap이며 LinkedHashMap으로 변경할 수도 있습니다. 둘의 순서에는 약간의 차이가 있습니다. LinkedHashMap으로 변경하는 방법은
JSONObject json = new JSONObject(true); 或者
JSONObject json = new JSONObject(new LinkedHashMap<>());
그러나 LinkedHashMap 유형의 경우 위의 도구 클래스가 유효하지 않으며 작동하지 않습니다.