package com.imed.costaccount.common.util; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * spring自带的jackson(json)工具类 */ @Slf4j public class JacksonUtil { private static ObjectMapper objectMapper = new ObjectMapper(); // 日起格式化 private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; // 以下静态初始化可以根据需求去掉对应的 static { //对象的所有字段全部列入 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); //取消默认转换timestamps形式 objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //忽略空Bean转json的错误 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } /** * 对象转json 字符串 * * @param obj 对象 * @return Json格式字符串 */ public static String obj2Str(T obj) { try { return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("parse object to string error {}", e.getMessage()); e.printStackTrace(); return null; } } /** * 对象转Json格式字符串(格式化的Json字符串) * * @param obj 对象 * @return 美化的Json格式字符串 */ public static String obj2StrPretty(T obj) { if (obj == null) { return null; } try { return obj instanceof String ? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); } catch (JsonProcessingException e) { log.warn("Parse Object to String error : {}", e.getMessage()); return null; } } /** * json字符串转对象 * * @param str json字符串 * @param clazz clazz对象 * @param 泛型 * @return T */ public static T str2Obj(String str, Class clazz) { if (StrUtil.isBlank(str) || Objects.isNull(clazz)) { log.error("parse string to object error : Params is null"); return null; } T t = null; try { t = clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz); } catch (JsonProcessingException e) { e.printStackTrace(); } return t; } /** * 字符串转List等集合类型使用 * 样例: * * JacksonUtil.string2ObjList(str,new TypeReference>{}) * @param str 字符串 * @param typeReference 泛型包装 * @param 泛型 * @return T * */ public static T str2ObjList(String str, TypeReference typeReference) { if (StrUtil.isBlank(str) || Objects.isNull(typeReference)) { log.error("parse string to object error : Params is null"); return null; } try { return (T) (typeReference.getType().equals(String.class) ? str : objectMapper.readValue(str, typeReference)); } catch (JsonProcessingException e) { log.warn("Parse String to Object error", e); return null; } } /** * 字符串转List等集合类型使用 * 样例: * JacksonUtil.string2ObjList(str,List.class,User.class) * @param str json字符串 * @param collectionClazz 集合class对象 * @param elementClazzs 元素class对象 * @param 返回的类型 * @return T */ public static T str2ObjList(String str, Class collectionClazz, Class... elementClazzs) { JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClazz, elementClazzs); try { return objectMapper.readValue(str, javaType); } catch (IOException e) { log.warn("Parse String to Object error : {}" + e.getMessage()); return null; } } /** * json字符串转为泛型 Map * 可根据类型自己创建不同的泛型Map * @param str json字符串 * @return */ public static Map str2Map(String str) { JavaType javaType = objectMapper.getTypeFactory().constructParametricType(Map.class, String.class, Object.class); try { return objectMapper.readValue(str, javaType); } catch (JsonProcessingException e) { e.printStackTrace(); return null; } } /** * 构建json字符串 * @return json Str */ public static JacksonUtil.JsonBuilder builder() { return new JacksonUtil.JsonBuilder(); } public static class JsonBuilder { private Map map = new HashMap<>(); JsonBuilder(){} public JacksonUtil.JsonBuilder put(String key, Object value) { map.put(key, value); return this; } public String build() { ObjectMapper objectMapper = new ObjectMapper(); try { objectMapper.writeValueAsString(this.map); } catch (JsonProcessingException e) { e.printStackTrace(); } return "{}"; } } }