Fork me on GitHub

高可用JsonUtil封装

前言

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

JsonUtil封装讲解

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

初始化ObjectMapper

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

1
private static ObjectMapper objectMapper = new ObjectMapper();

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 /*
* 初始化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类拿上来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

/**
* 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等对象而设计的。

使用方式:List<User> users = JsonUtil.string2Obj(userListStr,List.class,User.class); 第一个参数为json字符串,第二个为集合类型,第三个为集合当中所存放的对象类型。

联系

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

坚持原创技术分享,您的支持将鼓励我继续创作!