多层复杂json按字典排序(A-Z,a-z)

一、引言

    在某些场景需要对传输过来的JSON数据进行顺序排序,例如有些加签验签是对整个报文的Body域全部排序,进行的签名的,但大部分的json排序是单层的,对内层的json与json数组并未排序,下面将通过递归的方式,实现对多层json进行按字段名的“字典”顺序排列(A-Z,a-z)。

二、实现

public class jsonTest {

    public static void main(String[] args) {

        String str = "{\"Head\":{\"version\":\"2.0\",\"chnlId\":\"shop\",\"txnTime\":\"20200722113700\",\"txnSeqNo\":\"shop20200722002009\",\"prodNo\":\"01\",\"Sign\":\"aaaaaaaaaaaa\"},\"Body\":{\"orderDesc\":{\"orderDate\":\"20200722\",\"orderId\":\"2020072200001\"},\"subOrder\":[{\"merInnerCd\":\"202007000000033\",\"orgMerOrderId\":\"202007000000000001\",\"subAgreePrice\":[{\"a\":{\"cccc\":\"3333\",\"bbbb\":\"2222\",\"aaaa\":\"1111\"},\"b\":\"2222\",\"c\":\"3333\"},{\"b\":\"111\",\"a\":\"222\"}],\"subPointNum\":\"1\"},{\"merInnerCd\":\"202007000000020\",\"merOrderId\":\"rderId56\",\"orgMerOrderId\":\"20200721090001\",\"subPointNum\":\"2\"}],\"a\":\"10\",\"couponAmt\":\"\",\"couponBankAmt\":\"\",\"custId\":\"123456122\",\"pointNum\":\"1\",\"txnAmt\":{\"cccc\":\"3333\",\"bbbb\":\"2222\",\"aaaa\":\"1111\"},\"txnSeqNo\":\"202007722000001\"}}";
        Map<String, Object> json = jsonToMap(str);
        System.out.println("排序后的json>>>"+JSONObject.toJSONString(json));
        System.out.println("=========================");
        Map<String, Object> bodys = jsonToMap(JSONObject.toJSONString(json.get("Body")));
        System.out.println("排序后的json>>>"+JSONObject.toJSONString(bodys));
        
    }

    /**
     * JSON转顺序排序的Map(为了方便后期获取数据,应答就不返回JSON字符串了,可自行去转换)
     *
     * @param jsonStr 原始json
     * @return 响应的map
     */
    public static Map<String, Object> jsonToMap(String jsonStr) {
        Map<String, Object> treeMap = new TreeMap();
        JSONObject json = JSONObject.parseObject(jsonStr, Feature.OrderedField);//Feature.OrderedField实现解析后保存不乱序
        Iterator<String> keys = json.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            Object value = json.get(key);
            //判断传入kay-value中是否含有""或null
            if (json.get(key) == null || value == null || value.toString().length() == 0) {
                //当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-value
                continue;
            }
            // 判断是否为JSONArray(json数组)
            if (value instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) value;
                List<Object> arrayList = new ArrayList<>();
                for (Object object : jsonArray) {
                    // 判断是否为JSONObject,如果是 转化成TreeMap
                    if (object instanceof JSONObject) {
                        object = jsonToMap(object.toString());
                    }
                    arrayList.add(object);
                }
                treeMap.put(key, arrayList);
            } else {
                //判断该JSON中是否嵌套JSON
                boolean flag = isJSONValid(value.toString());
                if (flag) {
                    //若嵌套json了,通过递归再对嵌套的json(即子json)进行排序
                    value = jsonToMap(value.toString());
                }
                // 其他基础类型直接放入treeMap
                // JSONObject可进行再次解析转换
                treeMap.put(key, value);
            }
        }
        return treeMap;
    }

    /**
     * 校验是否是JSON字符串
     *
     * @param json 传入数据
     * @return 是JSON返回true, 否则false
     */
    public final static boolean isJSONValid(String json) {
        try {
            JSONObject.parseObject(json);
        } catch (JSONException ex) {
            return false;
        }
        return true;
    }
    
}

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值