我是靠谱客的博主 无聊口红,这篇文章主要介绍使用jackson对类的属性按要求序列化和反序列化@JsonDeserialize与@JsonSerialize及手动注册moudle,序列化反序列化指定别名,现在分享给大家,希望可以做个参考。

注解方式使用demo

复制代码
1
2
3
4
@JsonDeserialize(using= LocalDateTimeJsonDeserializer.class) @JsonSerialize(using= LocalDateTimeJsonSerializer.class) private LocalDateTime time;

@JsonDeserialize反序列化时对应的字段的解析

在反序列化json字符串的时候,对被注解的字段按照要求的格式去解析为要求的类型

demo中Test类只有一个time属性
在这里插入图片描述

复制代码
1
2
3
String str = """{"time":"2020-08-08 12:12:12"}""" Test test = objectMapper.readValue(str,Test.class)
复制代码
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
package com.fchan.layui.service; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import lombok.Data; import org.springframework.util.StringUtils; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Data public class LocalDateTimeJsonDeserializer extends JsonDeserializer<LocalDateTime> { private final DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { if(!StringUtils.isEmpty(p)){ return LocalDateTime.parse(p.getText(),dateTimeFormat); } return null; } }

@JsonSerialize

demo将Date类型的属性在序列化的时候变成时间戳
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.chan.wechatshop.utils.serializer; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.Date; public class Date2LongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(date.getTime() / 1000); } }

Jackson的ObjectMapper手动注册module设置序列化和反序列化时的需求

复制代码
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
package com.fchan.layui.service; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class JSONUtils { private static ObjectMapper objectMapper = new ObjectMapper(); private static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DATE_PATTERN = "yyyy-MM-dd"; private static final String TIME_PATTERN = "HH:mm:ss"; static { //设置java.util.Date时间类的序列化以及反序列化的格式 objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_PATTERN)); // 初始化JavaTimeModule JavaTimeModule javaTimeModule = new JavaTimeModule(); //处理LocalDateTime DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(STANDARD_PATTERN); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); //处理LocalDate DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter)); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter)); //处理LocalTime DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(TIME_PATTERN); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); //注册时间模块, 支持支持jsr310, 即新的时间类(java.time包下的时间类) objectMapper.registerModule(javaTimeModule); // 包含所有字段 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); // 在序列化一个空对象时时不抛出异常 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); // 忽略反序列化时在json字符串中存在, 但在java对象中不存在的属性 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } }

Jackson序列化和反序列化忽略字段

设置Jackson序列化时只包含不为空的字段

复制代码
1
2
new ObjectMapper().setSerializationInclusion(Include.NON_NULL);

设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性

复制代码
1
2
new ObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Jackson序列化时忽略特定字段的方式

方式一:FilterProvider

a)在需要忽略某些字段的class上添加@JsonFilter("fieldFilter")

b)ObjectMapper设置过滤器

复制代码
1
2
3
4
5
6
FilterProvider filterProvider = new SimpleFilterProvider(); SimpleBeanPropertyFilter fieldFilter = SimpleBeanPropertyFilter().serializeAllExcept("name"); filterProvider.addFilter("fieldFilter"); new ObjectMapper.setFilters(filterProvider );

方式二:使用@JsonIgnore

在需要忽略的字段上标注注解@JsonIgnore,在序列化时即可忽略该字段

序列化反序列化指定别名

复制代码
1
2
3
4
5
public class Cat { @JsonProperty("fn") // 定义了一个更精简的别名 public String firstName; }

序列化:

复制代码
1
2
{"fn": "杨XX"}

反序列化:
这个时候要注意原来的属性名已经无法再反序列化的时候拿到值了,传递给后端的json对象中该属性要用别名

复制代码
1
2
// 请求参数_1:{"fn": "456"},后端成功解析。

最后

以上就是无聊口红最近收集整理的关于使用jackson对类的属性按要求序列化和反序列化@JsonDeserialize与@JsonSerialize及手动注册moudle,序列化反序列化指定别名的全部内容,更多相关使用jackson对类内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部