Jackson序列化与反序列化
一、Jackson简介
1、什么是Jackson
Jackson被认为是"Java JSON库"或"Java最好的JSON解析器"。或简单地被当作"JSON for Java"。不仅如此,Jackson 还是一套用于 Java(和 JVM 平台)的数据处理工具,包括流式 JSON parser / generator库、匹配 data-binding 库(POJO和JSON相互转换),还有一个额外的 data format 模块来处理 Avro, BSON, CBOR, CSV, Smile, (Java) Properties, Protobuf, TOML, XML, YAML 这些数据编码,甚至还有大量的数据格式模块,来支持被广泛使用的数据类型如 Guava, Joda, PCollections 等等
核心组件存在于他们自己的项目下,包括三个核心包(streaming, databind, annotations);数据格式库;数据类型库;JAX-RS provider;和一个复杂的扩展模块—这个project 连接各个模块的中心枢纽
2、核心模块
核心模块是扩展(模块)构建的基础。目前有3个模块 (Jackson 2.x为例) :
-
Annotations (docs) (“jackson-annotations”) 包含标准 Jackson 注解
-
Databind (docs) (“jackson-databind”) 实现data-binding (和 object serialization) ,支持
streaming
包; 它依赖于streaming
和annotations
包
二、ObjectMapper常见使用
ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换
1、ObjectMapper的常用配置
1 | private static final ObjectMapper mapper; |
2、ObjectMapper的常用方法
2.1 json字符串转对象
1 | ObjectMapper mapper = new ObjectMapper(); |
2.2 数组和对象之间转换
1 | //对象转为byte数组 |
2.3 集合和json字符串之间转换
1 | List<Student> studentList= new ArrayList<>(); |
2.4 map和json字符串之间转换
1 | Map<String, Object> testMap = new HashMap<>(); |
2.5 日期转json字符串
1 | // 修改时间格式 |
2.6 readTree()方法
此方法更灵活,可以只将用户感兴趣的Json串信息值提取出来。主要利用ObjectMapper提供的readTree和Jackson提供的JsonNode类来实现
1 | String test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}"; |
3、Java Web与ObjectMapper
在开发 Spring Web 应用程序时,如果自定义了 ObjectMapper,并把它注册成了Bean,那很可能会导致 Spring Web 使用的 ObjectMapper 也被替换,导致 Bug。例如下面的bean,注册到Spring后就会把Spring原有的配置覆盖,导致原有的序列化配置丢失
1 |
|
针对这个问题,有三种解决方法
-
使用
objectMapper.configure(SerializationFeature.xxx,true);
把配置补齐 -
设置自定义类型,加上
@JsonIgnoreProperties
注解,开启 ignoreUnknown
属性,以实现反序列化时忽略额外的数据 -
不要自定义 ObjectMapper,而是直接在配置文件设置相关参数,来修改
Spring 默认的 ObjectMapper 的功能,例如:spring.jackson.serialization.write_enums_using_index=true
另外,通过查找JacksonProperties
类源码,可以发现很多配置类的属性,可以配合使用
4、Redis序列化的一个例子
1 |
|
https://blog.csdn.net/qq_46186167/article/details/123671712
https://www.tabnine.com/code/java/methods/com.fasterxml.jackson.databind.ObjectMapper/configure