SpringBoot 项目使用 Jackson 实现解析和序列化 JSON 彻底抛弃FastJson home 编辑时间 2020/06/03 ![](/api/file/getImage?fileId=5ed7515216199b501c00c2ae) ## 前言 关于 `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 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay 微信小程序首次请求慢 Safari浏览器访问慢 pending 10秒 可能是HTTPS证书的锅 Vue 实现页面到底自动加载无限滚动且不卡方法