package com.example.util.uploadLocalost;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class JsonUtil {

    /**
     * 功能描述:  JSONArray到json字符串-数组类型的转换
     *
     * @param jsonArray JSON ARRAY
     * @return JSON ARRAY
     */
    public static String toStr(JSONArray jsonArray) {
        return JSONArray.toJSONString(jsonArray);
    }

    /**
     * 功能描述:JavaBean到json字符串-简单对象类型的转换
     *
     * @param object OBJECT
     * @return 字符串
     */
    public static String toStr(Object object) {
        return JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * json字符串-简单对象型到JSONObject的转换
     *
     * @param json_str 要转为JSON对象的字符串
     * @return JSON OBJECT
     */
    private static JSONObject toJsonObj(String json_str) {
        return JSONObject.parseObject(json_str);
    }


    /**
     * 功能描述:json字符串-简单对象型与javaBean之间的转换
     *
     * @param json_str json字符串-复杂对象型
     * @param type     对象类型
     * @return java bean
     */
    public static <T> T toBean(String json_str, TypeReference<?> type) {
        return (T) JSON.parseObject(json_str, type);
    }

    /**
     * 功能描述:json字符串-简单对象型与javaBean之间的转换
     *
     * @param json_str json字符串-简单对象型
     * @param type     对象类型
     * @return java bean
     */
    public static <T> T toBean(String json_str, Class type) {
        return (T) JSON.parseObject(json_str, type);
    }

    /**
     * @param json_str json  字符串
     * @return 字符串
     */
    public static StringBuilder formatJsonStr(String json_str) {
        int level = 0;
        //存放格式化的json字符串
        StringBuilder jsonForMatStr = new StringBuilder();
        for (int index = 0; index < json_str.length(); index++)//将字符串中的字符逐个按行输出
        {
            //获取s中的每个字符
            char c = json_str.charAt(index);

            //level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\t
            if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
                jsonForMatStr.append(getLevelStr(level));
            }
            //遇到"{"和"["要增加空格和换行，遇到"}"和"]"要减少空格，以对应，遇到","要换行
            switch (c) {
                case '{':
                case '[':
                    jsonForMatStr.append(c).append("\n");
                    level++;
                    break;
                case ',':
                    jsonForMatStr.append(c).append("\n");
                    break;
                case '}':
                case ']':
                    jsonForMatStr.append("\n");
                    level--;
                    jsonForMatStr.append(getLevelStr(level));
                    jsonForMatStr.append(c);
                    break;
                default:
                    jsonForMatStr.append(c);
                    break;
            }
        }
        return jsonForMatStr;
    }

    /**
     * 功能描述:
     *
     * @param level level
     * @return string
     */
    private static String getLevelStr(int level) {
        StringBuilder levelStr = new StringBuilder();
        for (int levelI = 0; levelI < level; levelI++) {
            levelStr.append("\t");
        }
        return levelStr.toString();
    }


}
