日常Java开发中也就自然而然的经常会遇到JSON的序列化与反序列化
,而面对JSON序列化工具我们常用的有阿里的 Fastjson
、Spring MVC 内置的 Jackson
还有谷歌的Gson
,前面我们也说了 谷歌的Gson,若不知道的小伙伴可点击查看 ,那么今天我们来说下 Spring MVC 内置的 Jackson
是如何处理 JSON 序列化与反序列化!
Jackson 是一个 Java 用来处理 JSON 格式数据的的类库,性能非常好,功能非常强大。除了支持常用的json,同时还支持 Smile,BSON,XML,CSV,YAML。
Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快
运行时占用内存比较低,性能比较好
有灵活的 API,可以很容易进行扩展和定制。
Jackson
的 json库
提供了3种API
Streaming API
: 性能最好
Tree Model
: 最灵活
Data Binding
: 最方便
其中最常用
的就是Data Binding
,为什么呢?
因为 Data Binding
中使用的 ObjectMapper
是线程安全
的,所以应该重用。
jackson-core
核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
jackson-annotations
注解包,提供标准注解功能;
jackson-databind
数据绑定包, 提供基于”对象绑定” 解析的相关 API ( ObjectMapper ) 和”树模型” 解析的相关 API (JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。
Jackson 是基于 JavaBean 来序列化属性的,所以必须写 set与get 方法 。如果属性没有 GETTER 方法,默认是不会输出该属性的
下面我们来说下 Jackson 的常用的方法,想要使用前肯定得先下载 Jackson 的jar 包
如果小伙伴们使用的是 Spring
和 Spring MVC
、Spring Boot
项目,可以不需要下载 jar 包
和 导包
, 因为 Spring MVC 内置了 Jackson
的依赖包
若是基础的 Web 项目
可看下如何下载 Jackson
在 pom.xml
直接引入 Gson 依赖
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.9version>
dependency>
直接复制以下链接
,下载对应的 jar 包
,引入项目的 lib
目录下即可
Central Maven repository
https://repo1.maven.org/maven2/com/fasterxml/jackson/core
Wiki
https://github.com/FasterXML/jackson-core/wiki
下载好了接下来我们就看看如何使用!
上边简介也说了, Jackson 主要是用来处理 Java 的 JSON 格式数据的的类库
那首先肯定要创建一个 Java 实体类
实体类 Student.java
package com.gsontest.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: Student
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/10/23 15:29
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer no;
private String name;
private String sex;
private Integer age;
}
前面我们也说了 Jackson
最常用的是 Data Binding
,那么在使用Jackson
之前,我们先来了解一下Jackson
中的一个核心类
—— ObjectMapper
因为Jackson的所有JSON操作都在使用该类的API
ObjectMapper 是 JSON 操作的核心,它有多个 JSON 序列化的方法,可以把 JSON 字符串保存File、OutputStream 等不同的介质中
ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。
ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。
下面来说下 ObjectMapper
几个 writeValue
主要使用的方法
writeValue(File arg0, Object arg1)
把arg1
转成json序列
,并保存到arg0文件中
writeValue(OutputStream arg0, Object arg1)
把arg1
转成json序列
,并保存到arg0输出流中
writeValueAsBytes(Object arg0)
把arg0
转成json序列
,并把结果输出成字节数组
writeValueAsString(Object arg0)
把arg0
转成json序列
,并把结果输出成字符串
readValue
主要的使用方法
readValue (String content, Class
把json序列字符串
转成valueType对象
,并把结果输出所映射的对象
这些方法使用起来都十分简单!下面我们就来用代码演示下如何使用!
把 Java 实体对象转换为 json
(「序列化」)
这里就只介绍下 writeValueAsString(Object obj)
的使用方法,用于将Java对象转换为一个JSON字符串
package com.gsontest.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gsontest.bean.Student;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: JacksonToJsonTest
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/3 16:16
*/
public class JacksonToJsonTest {
public static void main(String[] args) throws JsonProcessingException {
//创建 Student 实体类
Student studentOne = new Student(1001, "序列化实体一", "男", 28);
Student studentTwo = new Student(2001, "序列化实体二", "女", 20);
ObjectMapper objectMapper = new ObjectMapper();
//Student类转JSON
//Student类转JSON 的结果为 :
//{"no":1001,"name":"序列化实体一","sex":"男","age":28}
String json = objectMapper.writeValueAsString(studentOne);
System.out.println("Student类转JSON 的结果为 :\n" + json + "\n");
//Java集合转JSON
//Java集合转JSON 的结果为 :
//[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]
List<Student> studentList = new ArrayList<Student>();
studentList.add(studentOne);
studentList.add(studentTwo);
String jsonList = objectMapper.writeValueAsString(studentList);
System.out.println("Java集合转JSON 的结果为 :\n" + jsonList);
}
}
运行结果
Student类转JSON 的结果为 :
{"no":1001,"name":"序列化实体一","sex":"男","age":28}
Java集合转JSON 的结果为 :
[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]
Jackson 提供了许多JSON反序列化的方法,其中比较常用的方法 就是 readValue
具体将 json
转换为 实体对象
和 List 集合对象
可见以下代码示例
package com.gsontest.test;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.gsontest.bean.Student;
import java.io.IOException;
import java.util.List;
/**
* @ClassName: JacksonFromJsonTest
* @Description: (描述)
* @Author: WHT
* @Version: V1.0
* @Date: 2020/11/3 17:42
*/
public class JacksonFromJsonTest {
public static void main(String[] args) throws IOException {
//上文实例代码 序列化的 json 字符串
String json = "{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28}";
String jsonList = "[{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28},{\"no\":2001,\"name\":\"序列化实体二\",\"sex\":\"女\",\"age\":20}]";
/*
* ObjectMapper支持 String , Byte Array, Reader,File,URL, InputStream 等 将 json 反序列化为 java 对象
*/
ObjectMapper objectMapper = new ObjectMapper();
Student student = objectMapper.readValue(json, Student.class);
System.out.println("String json字符串 反序列化为 Student 对象的结果为:\n" + student + "\n");
/*
* 对于 List 类型 ,可以调用 constructCollectionType 方法来序列化,也可以构造 TypeReference 来序列化。
*/
// 方法一 : 调用 constructCollectionType 方法来序列化
CollectionType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, Student.class);
// List studentList = objectMapper.readValue(jsonList, javaType);
//方法二 : 构造 TypeReference 来序列化
List<Student> studentList = objectMapper.readValue(jsonList, new TypeReference<List<Student>>(){});
System.out.println("studentList 集合遍历的结果:");
for (Student stu : studentList) {
System.out.println(stu);
}
}
}
运行结果
String json字符串 反序列化为 Student 对象的结果为:
Student(no=1001, name=序列化实体一, sex=男, age=28)
studentList 集合遍历的结果:
Student(no=1001, name=序列化实体一, sex=男, age=28)
Student(no=2001, name=序列化实体二, sex=女, age=20)
实例到这就讲解完了!下面我们来看下 Jackson 的注解的使用!
Jackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。
Jackson 常用的注解及用法如下
注解 | 用法 |
---|---|
@JsonProperty | 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty(“str_name”) private String name; |
@JsonFormat | 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm”) public Date cDate() |
@JsonPropertyOrder | 用于类, 指定属性在序列化时 json 中的顺序 , 示例: @JsonPropertyOrder({ “str_name”, “age” }) public class Student |
@JsonCreator | 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: @JsonCreator public Student(@JsonProperty(“name”)String name) {…} |
@JsonAnySetter | 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
@JsonAnyGetter | 用于方法 ,获取所有未序列化的属性 public Map |
后续我们详细说下Jackson 的 注解是如何使用的,这里只简单描述下。
看到这,Java 的 Jackson 是如何处理 JSON的序列化与反序列化就到此完结了,是不是非常nice,数据交互起来就更完美!快去试一试吧!别着急,还有更多的秘密等着你来探索!
分享嗨起来,美德传起来,点个星标从此探索之路不迷茫!
微信扫描二维码,关注我的原创日更公众号,可以查看更多程序的秘密!