银企直连(银行支付接口)开发之Json对KEY按ASSIIC码排序方法
Java •
对接银行接口,银企直连开发,一般都会需要对发送的Json参数的KEY按ASSIIC码排序,然后加密发送。
这里用最简单的办法来实现。
用到了TreeSet来排序,还用到了递归。代码如下:
import java.util.TreeSet;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public static String serialJsonOrdered(JSONObject json) throws JSONException {
StringBuilder appender = new StringBuilder();
appender.append("{");
Iterator<String> iteratorKeys = json.keys();
TreeSet<String> treeSet = new TreeSet();
while (iteratorKeys.hasNext()) {
treeSet.add(iteratorKeys.next());
}
boolean isFirstEle = true;
for (String key : treeSet) {
if (!isFirstEle) {
appender.append(",");
}
Object val = json.get(key);
if (val instanceof JSONObject) {
appender.append("\"").append(key).append("\":");
appender.append(serialJsonOrdered((JSONObject) val));
} else if (val instanceof JSONArray) {
JSONArray jarray = (JSONArray) val;
appender.append("\"").append(key).append("\":[");
boolean isFirstArrEle = true;
for (int i = 0; i < jarray.length(); i++) {
if (!isFirstArrEle) {
appender.append(",");
}
Object obj = jarray.get(i);
if (obj instanceof JSONObject) {
appender.append(serialJsonOrdered((JSONObject) obj));
} else {
appender.append("\"" + replaceSlash(obj.toString()) + "\"");
}
isFirstArrEle = false;
}
appender.append("]");
} else {
String value = "";
if (val instanceof String) {
value = "\"" + replaceSlash(val.toString()) + "\"";
} else {
value = replaceSlash(val.toString());
}
appender.append("\"").append(key).append("\":").append(value);
}
isFirstEle = false;
}
appender.append("}");
return appender.toString();
}
总结一下:
TreeSet的作用是保存无重复的数据,不过还对这些数据进行了排序。TreeMap的底层是通过红黑树实现的,所以TreeSet底层也是通过红黑树实现的。TreeSet最主要的特点就是对元素进行了排序。我们对其特点进行总结一下:
(1)TreeSet是基于TreeMap的NavigableSet实现。
(2)TreeSet的元素存储在TreeMap中的key中,TreeMap的value是一个常量对象。
(3)非线程安全 。
(4)java8新增分割器spliterator() 方法。