对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大灰狼1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值