在一个项目中要对对接方的参数进行验签,由对接方对参数进行排序后加密生成签名,我自身项目也需要对项目按相同规则进行签名,由于参数是多层的,里面有字符串,有JSONObject,JSONArray。所以写了一个通用的多层JSON按key首字母排序方法。上代码:
```
public static void main(String[] args) { String json = "{}"; System.out.println(fullSort(json)); }
/**
- 排序方法
- @param json */ public static void sort(JSONObject json) { ArrayList<Map.Entry<String, Object>> entries = new ArrayList<>(json.entrySet()); entries.sort((e1,e2)->{ return e1.getKey().toLowerCase().compareTo(e2.getKey().toLowerCase());//因为默认排序是根据aci码来的,这儿我需要根据字母顺序,所以转成小写排序 }); json.clear(); entries.forEach(o -> { json.put(o.getKey(), o.getValue()); }); }
/**
- JSON递归排序
- @param json
- @return */ public static String fullSort(String json) { if (StringUtils.isEmpty(json)) { return json; } JSONObject result = JSON.parseObject(json, Feature.OrderedField); LinkedList queue = new LinkedList<>(); queue.add(result); //使用递归,对多层JSON进行排序 while (!queue.isEmpty()) { JSONObject data = queue.removeFirst(); sort(data); data.forEach((key, value) -> { if (value instanceof JSONObject) { queue.add((JSONObject) value); } else if (value instanceof JSONArray) { ((JSONArray) value).forEach(o -> { if (o instanceof JSONObject) { queue.add((JSONObject) o); } }); } }); } return JSON.toJSONString(result); }