首页 归档 关于 文件 Github
×

Jackson 的 使用

2020-09-25 16:55:45
J-Tools
  • Jackson
本文总阅读量(次):
本文字数统计(字):911
本文阅读时长(分):4

依赖

1
2
3
4
5
6
<!-- 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>

jackson-databind 依赖 jackson-core 和 jackson-annotations,当添加 jackson-databind 之后, jackson-core 和 jackson-annotations 也随之添加到 Java 项目工程中。
在添加相关依赖包之后,就可以使用 Jackson。

配置信息

//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 

//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ 
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) 

//在序列化时忽略值为 null 的属性 
mapper.setSerializationInclusion(Include.NON_NULL); 

//忽略值为默认值的属性 
mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);

更多配置信息可以查看 Jackson 的 DeserializationFeature,SerializationFeature 和 Include。

注解

Jackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。
常用的注解及用法如下:

@JsonProperty:用于属性,把属性的名称序列化时转换为另外一个名称。

@JsonProperty("birth_date")
 private Date birthDate;

@JsonFormat:用于属性或者方法,把属性的格式序列化时转换成指定的格式。

@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
 public Date birthDate;

@JsonPropertyOrder:用于类,指定属性在序列化时 json 中的顺序。

@JsonPropertyOrder({ "birth_date", "name" })
 public class Person{}

说明

Jackson 最常用的 API 就是基于”对象绑定” 的 ObjectMapper。
writeValue:将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。
readValue:将不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。

封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;

import java.io.IOException;

/**
* author :demon
* date :2021 2021/11/2 11:18
* desc :
*/
public class ObjectMapperUtil {

private static ObjectMapperUtil objectMapperUtil;
private ObjectMapper objectMapper;

private ObjectMapperUtil() {
System.out.println("初始化-ObjectMapper-");
objectMapper = new ObjectMapper();

// json不进行换行缩进等操作 默认就是不进行操作,写了这行和没写的效果一样
objectMapper.disable(SerializationFeature.INDENT_OUTPUT);

// 属性为Null的不进行序列化,只对pojo起作用,对map和list不起作用
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

// json是否允许属性名没有引号 ,默认是false
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// json是否允许属性名为单引号 ,默认是false
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 反序列化的时候如果多了其他属性,不抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果是空对象的时候,不抛异常
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

//属性为null的转换
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
arg1.writeString("");
}
});

// 取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
// objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

}

public static ObjectMapperUtil getInstance() {
if (objectMapperUtil == null) {
objectMapperUtil = ObjectMapperUtilLoader.instance;
}
return objectMapperUtil;
}

public ObjectMapper getObjectMapper() {
return objectMapper;
}

private static class ObjectMapperUtilLoader {
private static final ObjectMapperUtil instance = new ObjectMapperUtil();
}

}

使用

实体对象转化字符串

1
2
3
4
5
try {
String jsonString = ObjectMapperUtil.getInstance().getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(new 实体对象());
} catch (JsonProcessingException e) {
e.printStackTrace();
}

字符串转化键值对象

1
2
3
4
5
try {
Map<String, Object> jsonMap = ObjectMapperUtil.getInstance().getObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>() {});
} catch (JsonProcessingException e) {
e.printStackTrace();
}

创建对象

1
2
3
4
5
6
7
8
9
10
11
12
ObjectMapper objectMapper = ObjectMapperUtil.getInstance().getObjectMapper();

ObjectNode objectNode = objectMapper.createObjectNode();
objectNode.put("name", "张三");
objectNode.put("age", 30);

ArrayNode arrayNode = objectMapper.createArrayNode();
arrayNode.add("Java");
arrayNode.add("Python");
objectNode.set("job", arrayNode);

System.out.println(objectNode.toString()); // {"name":"张三","age":30,"job":["Java","Python"]}
完
Window10安装 Redis - 安装版
Maven项目的Pom配置

本文标题:Jackson 的 使用

文章作者:十二

发布时间:2020-09-25 16:55:45

最后更新:2022-08-24 17:56:44

原始链接:https://www.zhuqiaolun.com/2020/09/1601024145664/1601024145664/

许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

头像

十二

我想起那天夕阳下的奔跑,那是我逝去的青春。

分类

  • Blog4
  • ElasticSearch13
  • Git2
  • Go-FastDfs2
  • IDEA2
  • J-Package6
  • J-Tools21
  • Java2
  • JavaFx6
  • Kafka4
  • Linux2
  • Logger6
  • Maven5
  • MyBatis6
  • MyCat3
  • MySql2
  • Nginx5
  • OceanBase1
  • RabbitMq4
  • Redis6
  • SVN1
  • SpringBoot16
  • Tomcat6
  • WebService2
  • Windows2
  • kubernetes10

归档

  • 一月 20261
  • 十二月 20253
  • 八月 20252
  • 六月 20251
  • 二月 20251
  • 十二月 20244
  • 八月 202416
  • 六月 20241
  • 九月 20231
  • 八月 20231
  • 七月 20232
  • 八月 20222
  • 三月 202214
  • 二月 20224
  • 十一月 20211
  • 七月 20215
  • 六月 20213
  • 五月 20213
  • 四月 20211
  • 三月 202116
  • 二月 20212
  • 一月 20211
  • 十一月 202014
  • 十月 20201
  • 九月 202014
  • 八月 20205
  • 七月 20204
  • 六月 20208
  • 五月 20208

作品

我的微信 我的文件

网站信息

本站运行时间统计: 载入中...
本站文章字数统计:103.2k
本站文章数量统计:139
© 2026 十二  |  鄂ICP备18019781号-1  |  鄂公网安备42118202000044号
驱动于 Hexo  | 主题 antiquity  |  不蒜子告之 阁下是第个访客
首页 归档 关于 文件 Github