|
@@ -0,0 +1,161 @@
|
|
|
+package com.hrsk.cloud.eg.domain.common.utils;
|
|
|
+
|
|
|
+import com.google.gson.*;
|
|
|
+import com.google.gson.reflect.TypeToken;
|
|
|
+import com.hrsk.pangu.tool.exception.BizException;
|
|
|
+import com.sun.org.slf4j.internal.Logger;
|
|
|
+import com.sun.org.slf4j.internal.LoggerFactory;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import java.lang.reflect.Type;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Locale;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author zhangyy
|
|
|
+ * @version 1.0
|
|
|
+ * @description: GsonUtils
|
|
|
+ * @date 2024/8/26 18:46
|
|
|
+ */
|
|
|
+public class GsonUtil {
|
|
|
+ private static Gson gson =new Gson();
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(GsonUtil.class);
|
|
|
+ /**
|
|
|
+ * @description: 对象转json字符串
|
|
|
+ * @author zhangyy
|
|
|
+ * @date 2024/8/26 18:51
|
|
|
+ * @version 1.0
|
|
|
+ */
|
|
|
+ public static String doToJSONString(Object obj,String formatDate, boolean ignoreNull,
|
|
|
+ boolean pretty){
|
|
|
+ return getGson(formatDate,ignoreNull, pretty).toJson(obj);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将对象转为JSON字符串。
|
|
|
+ * 日期转为非时间戳的格式,不忽略null值的字段,不格式化JSON字符串
|
|
|
+ *
|
|
|
+ * @param obj 被转的对象
|
|
|
+ * @return JSON字符串,出异常时抛出
|
|
|
+ */
|
|
|
+ public static String toJSONString(Object obj) {
|
|
|
+ return doToJSONString(obj, "yyyy-MM-dd HH:mm:ss", false, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取ObjectMapper。其本身是线程安全的,可以作为成员变量,但传入的参数不可能每次都一样,所以不使用成员变量。
|
|
|
+ * (获取的Gson,在解析JSON字符串的时候,若字符串新增了目标类未知的字段,不报错,也就是兼容的。
|
|
|
+ * @param dateFormat 日期格式,传null或空串则不设置
|
|
|
+ * @param ignoreNull 是否忽略字段值是null的字段
|
|
|
+ * @param pretty 是否格式化
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static Gson getGson(String dateFormat,
|
|
|
+ boolean ignoreNull,
|
|
|
+ boolean pretty) {
|
|
|
+ GsonBuilder gsonBuilder = new GsonBuilder();
|
|
|
+
|
|
|
+ // 默认序列化的格式是 Feb 13, 2020 11:54:55 AM,如果不指定形式,改成序列化成时间戳形式
|
|
|
+ if (StringUtils.isNotBlank(dateFormat)) {
|
|
|
+ gsonBuilder.setDateFormat(dateFormat);
|
|
|
+ } else {
|
|
|
+ // 转json字符串,日期格式使用时间戳
|
|
|
+ gsonBuilder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
|
|
|
+ @Override
|
|
|
+ public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
|
|
|
+ return new JsonPrimitive(src.getTime());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // json字符串转对象,日期格式使用时间戳的输入
|
|
|
+ gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
|
|
|
+ @Override
|
|
|
+ public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
|
|
|
+ return new Date(json.getAsJsonPrimitive().getAsLong());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 默认忽略所有null值字段
|
|
|
+ if (!ignoreNull) {
|
|
|
+ gsonBuilder.serializeNulls();
|
|
|
+ }
|
|
|
+ // 默认不格式化
|
|
|
+ if (pretty) {
|
|
|
+ gsonBuilder.setPrettyPrinting();
|
|
|
+ }
|
|
|
+ return gsonBuilder.create();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 传入JSON字符串,不管是对象和列表,都能兼容的方法
|
|
|
+ *
|
|
|
+ * @param jsonStr
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static <T> T parseJSON(String jsonStr, Class<T> clazz, String dateFormat) {
|
|
|
+ try {
|
|
|
+ Gson gson = getGson(dateFormat, false, false);
|
|
|
+ return gson.fromJson(jsonStr, clazz);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("Invalid jsonStr,parse error:" + jsonStr, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: json字符串转对象
|
|
|
+ * @param:
|
|
|
+ * @return:
|
|
|
+ * @author zhangyy
|
|
|
+ * @date: 2024/8/26 19:28
|
|
|
+ */
|
|
|
+ public static <T> T parseJSON(String jsonStr, Class<T> clazz) {
|
|
|
+ try {
|
|
|
+ Gson gson = getGson("yyyy-MM-dd HH:mm:ss", false, false);
|
|
|
+ return gson.fromJson(jsonStr, clazz);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("Invalid jsonStr,parse error:" + jsonStr, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * json 字符串转成某个类的列表
|
|
|
+ *
|
|
|
+ * @param jsonStr 传入的JSON字串
|
|
|
+ * @param clazz 转为什么类型
|
|
|
+ * @param dateFormat 日期格式,传null或空串则不设置,不设置时默认格式化时间戳。当无法格式化的时候抛出异常
|
|
|
+ * @param <T> 类型
|
|
|
+ * @return 转换失败则抛出异常
|
|
|
+ */
|
|
|
+ public static <T> List<T> parseJSONList(String jsonStr, Class<T> clazz, String dateFormat) {
|
|
|
+ try {
|
|
|
+ Gson gson = getGson(dateFormat, false, false);
|
|
|
+ Type listType = TypeToken.getParameterized(ArrayList.class, clazz).getType();
|
|
|
+ return gson.fromJson(jsonStr, listType);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("Invalid jsonStr,parse error:" + jsonStr, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * json 字符串转成某个类的列表
|
|
|
+ *
|
|
|
+ * @param jsonStr 传入的JSON字串
|
|
|
+ * @param clazz 转为什么类型
|
|
|
+ * @param <T> 类型
|
|
|
+ * @return 转换失败则抛出异常
|
|
|
+ */
|
|
|
+ public static <T> List<T> parseJSONList(String jsonStr, Class<T> clazz) {
|
|
|
+ try {
|
|
|
+ Gson gson = getGson("yyyy-MM-dd HH:mm:ss", false, false);
|
|
|
+ Type listType = TypeToken.getParameterized(ArrayList.class, clazz).getType();
|
|
|
+ return gson.fromJson(jsonStr, listType);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("Invalid jsonStr,parse error:" + jsonStr, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|