SpringBoot 项目使用 Jackson 实现解析和序列化 JSON 彻底抛弃FastJson
2020-06-10
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
## 前言
关于 `Java` 解析 `String` 类型 `JSON`
一般刚开始接触用的都是 `Alibaba` 开源的 `FastJson`
`FastJson` 的确是一个很好的工具
但 `FastJson` 动不动就爆出一个反序列化漏洞
而且逛知乎也常常看大神们吐槽 `FastJson`
于是乎就决定使用其他工具来代替 `FastJson`
<br>
尝试了谷歌的 `GSON` 和 `Springboot` 自带的 `Jackson`
感觉还是 `Jackson` 更方便,不需要再引入外部依赖即可实现
## 代码
**JsonUtils工具类**
```java
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.skmagic.common.module.entity.PgUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Map;
/**
* JSON 工具类
* 基于Springboot自带的 Jackson
*
* @author zzzmh
* @version 1.0.0
* @email admin@zzzmh.cn
* @date 2020/4/21 16:23
*/
public class JsonUtils {
private static Logger logger = LoggerFactory.getLogger(JsonUtils.class);
public static ObjectMapper mapper = new ObjectMapper();
static {
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
}
public static String toJSONString(Object object) {
String result = "";
try {
result = mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return result;
}
public static <T> T toObject(String json, Class<T> clazz) {
T result = null;
try {
result = mapper.readValue(json, clazz);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return result;
}
public static <T> List toArray(String json, Class<T> clazz) {
try {
return (List) mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
} catch (JsonParseException e) {
logger.error("decode(String, JsonTypeReference<T>)", e);
e.printStackTrace();
} catch (JsonMappingException e) {
logger.error("decode(String, JsonTypeReference<T>)", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("decode(String, JsonTypeReference<T>)", e);
e.printStackTrace();
}
return null;
}
public static Map<String, Object> toObject(String json) {
return toObject(json, Map.class);
}
public static List<Map<String, Object>> toArray(String json) {
return toArray(json, Map.class);
}
public static void main(String[] args) {
// 字符串转List<Map>
String json = "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]";
List<Map<String,Object>> array = toArray(json);
System.out.println(array);
// 字符串转Map
json = "{\"id\":1,\"name\":\"张三\"}";
Map<String,Object> map = toObject(json);
System.out.println(map);
// 各种对象转JSON字符串
json = toJSONString(array);
System.out.println(json);
}
}
```
<br>
**运行结果**
```java
[{id=1, name=张三}, {id=2, name=李四}]
{id=1, name=张三}
[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]
```
<br>
**补充**
还存在一个已知问题需要注意
就是序列化、反序列化 `Date` `LocalDateTime` 时
格式需要额外配置,推荐使用 `Long` 类型时间戳
这里不再赘述就略过了
## END