SpringBoot 项目使用 Jackson 实现解析和序列化 JSON 彻底抛弃FastJson

前言
关于 Java
解析 String
类型 JSON
一般刚开始接触用的都是 Alibaba
开源的 FastJson
FastJson
的确是一个很好的工具
但 FastJson
动不动就爆出一个反序列化漏洞
而且逛知乎也常常看大神们吐槽 FastJson
于是乎就决定使用其他工具来代替 FastJson
尝试了谷歌的 GSON
和 Springboot
自带的 Jackson
感觉还是 Jackson
更方便,不需要再引入外部依赖即可实现
代码
JsonUtils工具类
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);
}
}
运行结果
[{id=1, name=张三}, {id=2, name=李四}]
{id=1, name=张三}
[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]
补充
还存在一个已知问题需要注意
就是序列化、反序列化 Date
LocalDateTime
时
格式需要额外配置,推荐使用 Long
类型时间戳
这里不再赘述就略过了
评论