背景:
鉴于项目想做一个后端请求重复拦截, 但是项目运行一段时间后观察日志发现,入参一样的请求并未成功拦截,,
问题:
所以拉了日志对请求进行比较,发现前端传输的 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()
拿到排序后的字符串就可以判断是否重复请求了