廖井涛
2025-11-19 a60803afc8981d10cfea1da44c26c4e50f0f6d82
north-glass-erp/src/main/java/com/example/erp/tools/JacksonUtil.java
New file
@@ -0,0 +1,90 @@
package com.example.erp.tools;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.boot.json.JsonParseException;
import java.util.List;
import java.util.concurrent.Callable;
// 将繁琐的异常处理进行了解决
public class JacksonUtil {
    /**
     * 工具类不需要创建实例对象
     */
    private JacksonUtil(){
    }
    /**
     * 给ObjectMapper进行单例模式,由于ObjectMapper 是线程安全的,可以复用,放置重复创建影响性能
     */
    private static final ObjectMapper objectMapper;
    static {
        objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
    }
    public static ObjectMapper getObjectMapper(){
        return objectMapper;
    }
    public static final <T> T tryParse(Callable<T> parser) {
        return JacksonUtil.tryParse(parser, JacksonException.class);
    }
    public static final <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) {
        try {
            return parser.call();
        }
        catch (Exception ex) {
            if (check.isAssignableFrom(ex.getClass())) {
                throw new JsonParseException(ex);
            }
            throw new IllegalStateException(ex);
        }
    }
    // 普通对象和List对象共同使用
    public static String writeValueAsString(Object object){
        return JacksonUtil.tryParse(()->{
            return JacksonUtil.getObjectMapper().writeValueAsString(object);
        });
    }
    // 普通对象的反序列化
    public static <T> T readValue(String str,Class<T> valueType){
        return JacksonUtil.tryParse(()->{
            return JacksonUtil.getObjectMapper().readValue(str,valueType);
        });
    }
    public static <T> T readValueObjectToString(Object object,TypeReference<T> valueType){
        String str = JacksonUtil.tryParse(()->{
            return JacksonUtil.getObjectMapper().writeValueAsString(object);
        });
        return JacksonUtil.tryParse(()->{
            return JacksonUtil.getObjectMapper().readValue(str,valueType);
        });
    }
    // List类型的反序列化
    public static <T> T readListValue(String str,Class<?> valueType){
        JavaType javaType = JacksonUtil.getObjectMapper().getTypeFactory().constructParametricType(List.class,valueType);
        return JacksonUtil.tryParse(()->{
            return JacksonUtil.getObjectMapper().readValue(str,javaType);
        });
    }
}