package com.persagy.framework.util;

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.SimplePropertyPreFilter;
import com.alibaba.fastjson.util.TypeUtils;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.List;

/**
 * @Description json工具类
 * @Author feng
 * @Date 2018/7/19 12:17
 * @Version 1.0
 */
public class JsonUtils {

    static {
        TypeUtils.compatibleWithJavaBean = true;
    }

    /**
     * 将json字符串转换成java对象
     *
     * @param json 需要转化json字符
     * @param cls  cls  返回实例对象类型
     * @return T
     */
    public static <T> T jsonToBean(String json, Class<T> cls) {
        return JSON.parseObject(json, cls);
    }

    public static <T> T getJsonFromInputStream(InputStream inputStream, Class<T> cls) throws IOException {

        return JSON.parseObject(inputStream, cls);
    }

    /**
     * 将json字符串转换成java对象
     *
     * @param json 需要转化json字符
     * @param cls  cls  返回实例对象类型
     * @return T
     */
    public static <T> T jsonToBean(String json, Type cls) {
        return JSON.parseObject(json, cls);
    }

    /**
     * 将json字符串转换成java对象
     *
     * @param json 需要转化json字符
     * @return T
     */
    public static <T> T jsonToBean(String json) {
        TypeReference<T> typeReference = new TypeReference<T>() {
        };
        return JSON.parseObject(json, typeReference.getType());
    }

    /**
     * 将json字符串转换成java对象
     *
     * @param json 需要转化json字符
     * @param cls  cls  返回实例对象类型
     * @return T
     */
    public static <T> T jsonToBean(byte[] json, Class<T> cls) {
        return JSON.parseObject(json, cls);
    }


    /**
     * 将json字符串转换成java对象
     *
     * @param json 需要转化json字符
     * @param cls  cls  返回实例对象类型
     * @return T     TypeReference typeReference = new TypeReference<JsonBean>() {};
     */
    public static <T> T jsonToBean(byte[] json, Type cls) {
        return JSON.parseObject(json, cls);
    }


    /**
     * 将json字符串转换成java List对象
     *
     * @param json 需要转化json字符
     * @param cls  cls  返回实例对象类型
     * @return List<T>
     */
    public static <T> List<T> jsonToList(String json, Class<T> cls) {
        return JSON.parseArray(json, cls);
    }

    /**
     * 将bean对象转化成json字符串
     *
     * @param obj 转化的对象实例
     * @return String  JSON 字符
     */
    public static String beanToJson(Object obj) {
        String result = JSON.toJSONString(obj);
        return result;
    }

    /**
     * 将bean对象转化成json字符串
     *
     * @param obj    转化的对象实例
     * @param filter 序列化处理
     * @return String  JSON 字符
     */
    public static String beanToJson(Object obj, SimplePropertyPreFilter filter) {
        return JSON.toJSONString(obj, filter);
    }


    /**
     * 价格json字符转换JSONObject
     *
     * @param jsonString 需要转换的字符
     * @return JSONObject
     */
    public static JSONObject parseJsonObject(String jsonString) {
        return JSONObject.parseObject(jsonString);
    }

    /**
     * 价格json字符转换JSONObject
     *
     * @param jsonString 需要转换的字符
     * @return JSONObject
     */
    public static JSONArray parseJsonArray(String jsonString) {
        return JSONArray.parseArray(jsonString);
    }
}
