高可用JsonUtil封装

原文地址 :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  泛型
     * @return 返回object序列化后json字符串,异常或object=null则返回null
     */
    public static  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序列化,并且返回格式化之后的字符串 
* 格式化 * * @param obj object * @param 泛型 * @return 返回object序列化后json字符串,异常或object=null则返回null */
public static 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
* 无法满足List等集合的反序列化(json转对象) * * @param str 待序列化json字符串 * @param clazz json序列化成的对象 * @param 泛型 * @return 返回对象,str为null和异常则返回null。否则返回clazz对象 */
public static T String2Obj(String str, Class 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反序列化
* json反序列化成以下:List Map等对象 * * @param str json * @param typeReference jackson当中序列化对象 * @param 泛型 * @return 返回typeReference当中制定类型 */
@SuppressWarnings("unchecked") public static T string2Obj(String str, TypeReference 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反序列化
* List复杂对象collectionClass 和 elementClass分别为List.class User.class * * @param str json * @param collectionClass 集合类型 * @param elementClasses 集合当中元素 * @param 泛型 * @return 返回对象 */
public static 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 string2Obj(String str, Class collectionClass, Class... elementClasses)这个方法就是着重为集合当中复杂对象的序列化和反序列化设计的。为了满足json反序列化成List Map

联系

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

  • Blog@ccoder’s blog
  • CSDN@ccoder
  • Github@ccoder
  • Email@ccoder or Gmail@ccoder

你可能感兴趣的:(JavaEE)