电脑上按Ctrl + D,下次访问更方便
服务分类

银企直连(银行支付接口)开发之Json对KEY按ASSIIC码排序方法

对接银行接口,银企直连开发,一般都会需要对发送的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() 方法。

发表回复

登录后才能评论
联系我们

联系我们

微信专属客服:

fuwu360微信客服

工作时间:周一至周五,9:30-18:30,节假日休息

返回顶部