JAVA 如何优雅的将多层嵌套JSON按key来排序

背景:

鉴于项目想做一个后端请求重复拦截, 但是项目运行一段时间后观察日志发现,入参一样的请求并未成功拦截,,

问题:

所以拉了日志对请求进行比较,发现前端传输的 JSON值一样,但是JSON内字段顺序不一样

方案:

于是上搜索了多个解决方案,,最终都没有一个比较精简和优美的代码解决,,思考再三,把多个方案取其精华,去其糟粕,自已写了一个如下: 
 

public static JSONObject sort(JSONObject json0bject){
    final ArrayList<String> keys = new ArrayList<>(json0bject.keySet());
    Collections.sort(keys);

    final JSONObject sortedJsonObject = new JSONObject(true);
    for (String key : keys) {
      final Object value = json0bject.get(key);
      if (value instanceof JSONObject) {
        sortedJsonObject.put(key, sort((JSONObject) value));
      } else if (value instanceof JSONArray){
        final JSONArray valueJsonArray = (JSONArray) value;
        final JSONArray jsonArray = new JSONArray(valueJsonArray.size());
        valueJsonArray.forEach(o -> {
          if (o instanceof JSONObject){
            jsonArray.add(sort((JSONObject) o));
          }
        });
        sortedJsonObject.put(key, jsonArray);
      } else {
        sortedJsonObject.put(key, value);
      }
    }
    return sortedJsonObject;
    }

结尾:

返回出的结果 使用

JSON.toJSONString()

拿到排序后的字符串就可以判断是否重复请求了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值