package cn.senins.common.utils;


import java.util.*;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONException;
import com.alibaba.fastjson2.JSONObject;

/**
 * @author xiefenghong
 * @version 1.0
 * @description
 * @date 2024/3/12 9:15
 */
public class JsonSortUtil {
    /**
     * JSON转顺序排序的Map(为了方便后期获取数据,应答就不返回JSON字符串了,可自行去转换)
     *
     * @param jsonStr 原始json
     * @return 响应的map
     */
    public static TreeMap<String, Object> jsonToMap(String jsonStr) {
        TreeMap<String, Object> treeMap = new TreeMap<>();
        JSONObject json = JSONObject.parseObject(jsonStr);// 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) {
                // 当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-value
                continue;
            }
            // 判断是否为JSONArray(json数组)
            if (value instanceof JSONArray jsonArray) {
                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 static boolean isJSONValid(String json) {
        if (Objects.isNull(json) || "null".equals(json) || json.isEmpty()) {
            return false;
        }
        try {
            JSONObject.parseObject(json, JSONObject.class);
        } catch (JSONException ex) {
            return false;
        }
        return true;
    }
}
