前言

关于 Java 解析 String 类型 JSON
一般刚开始接触用的都是 Alibaba 开源的 FastJson
FastJson 的确是一个很好的工具
FastJson 动不动就爆出一个反序列化漏洞
而且逛知乎也常常看大神们吐槽 FastJson
于是乎就决定使用其他工具来代替 FastJson

尝试了谷歌的 GSONSpringboot 自带的 Jackson
感觉还是 Jackson 更方便,不需要再引入外部依赖即可实现



代码

JsonUtils工具类

  1. import com.fasterxml.jackson.core.JsonGenerator;
  2. import com.fasterxml.jackson.core.JsonParseException;
  3. import com.fasterxml.jackson.core.JsonParser;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.core.type.TypeReference;
  6. import com.fasterxml.jackson.databind.*;
  7. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  8. import com.skmagic.common.module.entity.PgUser;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import java.io.IOException;
  12. import java.time.LocalDateTime;
  13. import java.time.ZoneOffset;
  14. import java.util.List;
  15. import java.util.Map;
  16. /**
  17. * JSON 工具类
  18. * 基于Springboot自带的 Jackson
  19. *
  20. * @author zzzmh
  21. * @version 1.0.0
  22. * @email admin@zzzmh.cn
  23. * @date 2020/4/21 16:23
  24. */
  25. public class JsonUtils {
  26. private static Logger logger = LoggerFactory.getLogger(JsonUtils.class);
  27. public static ObjectMapper mapper = new ObjectMapper();
  28. static {
  29. mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  30. mapper.registerModule(new JavaTimeModule());
  31. }
  32. public static String toJSONString(Object object) {
  33. String result = "";
  34. try {
  35. result = mapper.writeValueAsString(object);
  36. } catch (JsonProcessingException e) {
  37. e.printStackTrace();
  38. }
  39. return result;
  40. }
  41. public static <T> T toObject(String json, Class<T> clazz) {
  42. T result = null;
  43. try {
  44. result = mapper.readValue(json, clazz);
  45. } catch (JsonProcessingException e) {
  46. e.printStackTrace();
  47. }
  48. return result;
  49. }
  50. public static <T> List toArray(String json, Class<T> clazz) {
  51. try {
  52. return (List) mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
  53. } catch (JsonParseException e) {
  54. logger.error("decode(String, JsonTypeReference<T>)", e);
  55. e.printStackTrace();
  56. } catch (JsonMappingException e) {
  57. logger.error("decode(String, JsonTypeReference<T>)", e);
  58. e.printStackTrace();
  59. } catch (IOException e) {
  60. logger.error("decode(String, JsonTypeReference<T>)", e);
  61. e.printStackTrace();
  62. }
  63. return null;
  64. }
  65. public static Map<String, Object> toObject(String json) {
  66. return toObject(json, Map.class);
  67. }
  68. public static List<Map<String, Object>> toArray(String json) {
  69. return toArray(json, Map.class);
  70. }
  71. public static void main(String[] args) {
  72. // 字符串转List<Map>
  73. String json = "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]";
  74. List<Map<String,Object>> array = toArray(json);
  75. System.out.println(array);
  76. // 字符串转Map
  77. json = "{\"id\":1,\"name\":\"张三\"}";
  78. Map<String,Object> map = toObject(json);
  79. System.out.println(map);
  80. // 各种对象转JSON字符串
  81. json = toJSONString(array);
  82. System.out.println(json);
  83. }
  84. }


运行结果

  1. [{id=1, name=张三}, {id=2, name=李四}]
  2. {id=1, name=张三}
  3. [{"id":1,"name":"张三"},{"id":2,"name":"李四"}]


补充
还存在一个已知问题需要注意
就是序列化、反序列化 Date LocalDateTime
格式需要额外配置,推荐使用 Long 类型时间戳
这里不再赘述就略过了



END