package com.sjyt.icom.asst.common.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
import com.sjyt.icom.asst.common.deserializer.AnnotationDeserializer;
import com.sjyt.icom.asst.common.model.message.News;

import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
/**
 * JSON工具类
 *
 * @author renyanru
 * @version V1.0.0
 * @date 2022/5/20 15:14
 */
public class JsonUtils {
  private static final Gson gson;
  /** 谷歌 GsonBuilder 构造器 */
  static GsonBuilder gb = new GsonBuilder();

  static {
    // 不需要html escape
    gb.disableHtmlEscaping();
    gson =
        gb.registerTypeAdapter(News.class, new AnnotationDeserializer<News>()).create();
  }

  /**
   * Object对象转成JSON字符串后，进一步转成字节数组
   *
   * @param obj obj
   * @return return
   */
  public static byte[] object2JsonBytes(Object obj) {
    // 把对象转换成JSON
    String json = pojoToJson(obj);
    return json.getBytes(StandardCharsets.UTF_8);
  }
  /**
   * 使用谷歌 Gson 将 POJO 转成字符串
   *
   * @param obj obj
   * @return return
   */
  public static String pojoToJson(Object obj) {
    return gson.toJson(obj);
  }

  public static <T> T jsonBytes2Object(byte[] bytes, Class<T> tClass) {

    // 尽量把对象转换成JSON保存更稳妥
    try {
      String json = new String(bytes, StandardCharsets.UTF_8);
      return jsonToPojo(json, tClass);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * 使用谷歌 Gson 将字符串转成 POJO对象
   *
   * @param json json
   * @param tClass class
   * @param <T> t
   * @return return
   */
  public static <T> T jsonToPojo(String json, Class<T> tClass) {
    return gson.fromJson(json, tClass);
  }

  /**
   * 使用谷歌 Gson 将JsonElement转成 POJO对象
   *
   * @param je je
   * @param type type
   * @param <T> T
   * @return return
   */
  public static <T> T jsonToPojo(JsonElement je, Type type) {
    return gson.fromJson(je, type);
  }

  /**
   * 使用 谷歌 json 将字符串转成 POJO对象
   *
   * @param json json
   * @param type type
   * @param <T> t
   * @return return
   */
  public static <T> T jsonToPojo(String json, Type type) {
    return gson.fromJson(json, type);
  }

  public static <T> T jsonToPojo(String json, TypeToken typeToken) {
    return gson.fromJson(json, typeToken.getType());
  }
}
