Jackson使用笔记

前言

目前 Java 流行的 Json 数据处理工具主要有 Jackson 、 Gson 、 FastJson 等,其中 FastJson 频繁曝出数据解析漏洞、 Gson 在一般场景下数据处理效率比 Jackson 要低,故最终选择使用 Jackson 作为自己项目的 Json 数据处理工具。本文主要介绍了 Jackson 基本概念、常用方法以及常用场景。

介绍

Jackson 是一个简单基于 Java 的 JSON 库,它具有非常强大的数据绑定功能,并提供了一个框架,可方便的让你进行自定义的 Java 对象与 Json 、 XML 、 CSV 、 Protobuf 、 CBOR 对象间相互转化。 Jackson 所依赖的 jar 包较少,简单易用性能也要相对较高,并且 Jackson 社区相对比较活跃,更新速度也比较快。

使用

导入依赖

  1. Maven项目导入
    Maven 引入直接在 pom.xml 文件中加入以下代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.11.0</version>
</dependency>
  1. Java项目导入
    将以下三个Jar包下载并导入项目:

常用对象

ObjectMapper对象

ObjectMapper类是Jackson库的主要类。它提供了Java对象和Json之间的转化,主要通过JsonParserJsonGenerator实例来完成实际的对Json数据的读写操作。

  1. 配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 美化输出
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// 允许序列化空的POJO类
// (否则会抛出异常)
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// 把java.util.Date, Calendar输出为数字(时间戳)
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 在遇到未知属性的时候不抛出异常
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 强制JSON 空字符串("")转换为null对象值:
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
// 在JSON中允许C/C++ 样式的注释(非标准,默认禁用)
mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
// 允许没有引号的字段名(非标准)
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// 允许单引号(非标准)
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 强制转义非ASCII字符
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
// 将内容包裹为一个JSON属性,属性名由@JsonRootName注解指定
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
  1. 常用方法有:
方法名 说明
ObjectMapper configure() 更改此对象映射器的开/关序列化功能状态的方法
<T> T readValue() 用于将其他数据类型转为Java类型
JsonNode readTree() 方法将JSON内容反序列化为对应的Java树,返回结果树的根
void writeValue() 可用于将任何Java值序列化为JSON输出,写入指定位置
String writeValueAsString() 可用于将任何Java值序列化为JSON字符串
String writeValueAsBytes() 可用于将任何Java值序列化为字节数组

JsonFactory对象

Jackson包的主要工厂类,用于配置和构造reader(又名parser, JsonParser)和writer(又名generator, JsonGenerator)实例,这个工厂实例是线程安全的,如果有配置的话,可以重复使用。其常用方法有:

方法名 说明
JsonGenerator createJsonGenerator() 用于构造JSON生成器,将JSON内容按特定编码写入(覆盖)指定的文件
JsonGenerator createJsonParser() 用于构造解析给定类型内容的解析器

JsonGenerator对象

这个类主要是用来生成Json格式的内容的,我们可以使用JsonFactory的方法生成一个实例。

JsonParser对象

这个主要是用来读取Json格式的内容,并且完成解析操作的,我们可以使用JsonFactory的方法生成一个实例。

场景

文件存取——法一

1
2
3
4
5
6
7
8
User user = new User();
ObjectMapper mapper = new ObjectMapper(); 
//将Java对象(List、Map……)序列化到一个JSON文件
mapper.writeValue(new File("D:/fantasy.json"), user);

//读取JSON文件转换为对象(List、Map……)
user = mapper.readValue(new File("fantasy.json"), User.class);
System.out.println(user);

文件读取——法二

1
2
3
4
ObjectMapper mapper = new ObjectMapper();
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("D:/fantasy.json"), JsonEncoding.UTF8);
mapper.writeTree(jsonGenerator, dataJson);

常用对象互转

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ObjectMapper mapper = new ObjectMapper();
//json字符串转对象
User user = mapper.readValue(jsonString, User.class);
System.out.println(user);

//对象转json字符串
jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString);

//json字符串转为Map对象
Map map=mapper.readValue(jsonString, Map.class);
System.out.println(map);

// json字符串转List对象
List<User> userList = mapper.readValue(jsonString, new TypeReference<List<User>>() {});