高可用JsonUtil封装

xiaoxiao2021-02-28  46

原文地址 :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后。如果你看到这篇文章,千里之外,我在等你联系。

Blog@ccoder’s blog@ccoderGithub@ccoderEmail@ccoder or Gmail@ccoder
转载请注明原文地址: https://www.6miu.com/read-2629173.html

最新回复(0)