기존 json 재정렬

인터페이스에 서명하고 일반 텍스트 문자열을 접합할 때 대부분의 사람들은 입력 매개변수를 알파벳 순서로 정렬해야 한다는 데 동의하여 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 유형의 경우 위의 도구 클래스가 유효하지 않으며 작동하지 않습니다.

Supongo que te gusta

Origin blog.csdn.net/qq_29539827/article/details/130408309
Recomendado
Clasificación