对已有的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类型的,则上述的工具类则会失效不起作用

猜你喜欢

转载自blog.csdn.net/qq_29539827/article/details/130408309