高可用JsonUtil封装

本文介绍了如何封装一个高可用的JsonUtil工具类,利用Jackson的ObjectMapper实现对象与JSON字符串之间的高效转换。内容包括初始化ObjectMapper、各个转换方法的详细讲解,特别是针对集合中复杂对象的序列化和反序列化的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址 :redis连接池及常用API封装

前言

最近在做的项目当中需要将对象存储在redis当中。对于这个需求之前做的方式是使用Protostuff将对象进行序列化,现在让将其进行json序列化成String字符串存储在redis当中,后期调用时再将其反序列化成相应的对象。有这个想法就诞生了这个JSonUtil工具类,高可用的json序列化和反序列化。满足普通对象、集合、复杂对象和json之间的相互转换。

JsonUtil封装讲解

使用Jackson的ObjectMapper进行构建对象和json之间的相互转换。

初始化ObjectMapper

首先我们需要创建一个ObjectMapper对象

 private static ObjectMapper objectMapper = new ObjectMapper();

然后再来初始化objectMapper当中的各项参数。

 /*
  * 初始化objectMapper
  */
static {
    /*对象的所有字段全部列入序列化*/
    objectMapper.setSerializationInclusion(Inclusion.ALWAYS);

    /*取消默认转换timestamps*/
    objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

    /*忽略空bean转json错误*/
    objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

    /*所有的日期格式都统一为以下格式:yyyy-MM-dd HH:mm:ss*/
    objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));

    /*反序列化时,忽略在json字符串当中存在,但是在java对象当中不存在的对应属性的情况,防止错误*/
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}

各个方法的讲解

直接将JsonUtil类拿上来。


/**
 * json序列化工具类
 *
 * @author chencong
 */
@Slf4j
public class JsonUtil {


    private static ObjectMapper objectMapper = new ObjectMapper();

    /*
     * 初始化objectMapper
     */
    static {
        /*对象的所有字段全部列入序列化*/
        objectMapper.setSerializationInclusion(Inclusion.ALWAYS);

        /*取消默认转换timestamps*/
        objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

        /*忽略空bean转json错误*/
        objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

        /*所有的日期格式都统一为以下格式:yyyy-MM-dd HH:mm:ss*/
        objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));

        /*反序列化时,忽略在json字符串当中存在,但是在java对象当中不存在的对应属性的情况,防止错误*/
        objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    }

    /**
     * object转换json序列化
     *
     * @param obj object
     * @param <T> 泛型
     * @return 返回object序列化后json字符串,异常或object=null则返回null
     */
    public static <T> String obj2String(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
            log.warn("parse object to String error ", e);
            return null;
        }
    }

    /**
     * object 转换json序列化,并且返回格式化之后的字符串 <br>
     * 格式化
     *
     * @param obj object
     * @param <T> 泛型
     * @return 返回object序列化后json字符串,异常或object=null则返回null
     */
    public static <T> String obj2StringPretty(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            log.warn("parse object to String error ", e);
            return null;
        }
    }

    /**
     * String反序列化为执行类型clazz <br>
     * 无法满足List<User>等集合的反序列化(json转对象)
     *
     * @param str   待序列化json字符串
     * @param clazz json序列化成的对象
     * @param <T>   泛型
     * @return 返回对象,str为null和异常则返回null。否则返回clazz对象
     */
    public static <T> T String2Obj(String str, Class<T> clazz) {
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
        } catch (IOException e) {
            log.warn("parse string to object error ", e);
            return null;
        }
    }

    /**
     * string反序列化<br>
     * json反序列化成以下:List<User> Map<User,Category>等对象
     *
     * @param str           json
     * @param typeReference jackson当中序列化对象
     * @param <T>           泛型
     * @return 返回typeReference当中制定类型
     */
    @SuppressWarnings("unchecked")
    public static <T> T string2Obj(String str, TypeReference<T> typeReference) {
        if (StringUtils.isEmpty(str) || typeReference == null) {
            return null;
        }
        try {
            return (T) (typeReference.getType().equals(String.class) ? str : objectMapper.readValue(str, typeReference));
        } catch (IOException e) {
            log.warn("parse string to object error ", e);
            return null;
        }
    }

    /**
     * string反序列化<br>
     * List<User>复杂对象collectionClass 和 elementClass分别为List.class User.class
     *
     * @param str             json
     * @param collectionClass 集合类型
     * @param elementClasses  集合当中元素
     * @param <T>             泛型
     * @return 返回对象
     */
    public static <T> T string2Obj(String str, Class<?> collectionClass, Class<?>... elementClasses) {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
        try {
            return objectMapper.readValue(str, javaType);
        } catch (Exception e) {
            log.warn("parse string to object error ", e);
            return null;
        }
    }
}

特别说明

<T> T string2Obj(String str, Class<?> collectionClass, Class<?>... elementClasses)这个方法就是着重为集合当中复杂对象的序列化和反序列化设计的。为了满足json反序列化成List Map

联系

聪聪的独立博客 ,一个喜欢技术,喜欢钻研的95后。如果你看到这篇文章,千里之外,我在等你联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值