【Java】Jackson序列化案例分析

embedded/2024/12/26 9:22:24/

1.Jackson介绍

Jackson 是一个流行的 Java 库,用于处理 JSON 数据。它提供了高效的序列化和反序列化功能,能够将 Java 对象转换为 JSON 格式,反之亦然。
它由 FasterXML 开发和维护。Jackson 的设计目标是提供高效、灵活且易于使用的 JSON 处理功能。它广泛应用于各种 Java 项目和框架中,成为处理 JSON 的事实标准之一。

  • 序列化是将 Java 对象转换为 JSON 字符串的过程。在 Jackson 中,这个过程通常由 ObjectMapper 类来完成。ObjectMapper 是 Jackson 的核心类,提供了许多方法来进行序列化操作。
  • 反序列化是将 JSON 字符串转换为 Java 对象的过程。在 Jackson 中,这个过程同样由 ObjectMapper 类来完成。

本文主要介绍Jaskson的序列化(writeValueAsString),涉及时间格式的自定义序列化

2.案例

尝试
Bean类,设置不同的数据类型。

java">import lombok.Data; // get/set方法
import java.time.LocalDateTime;
import java.util.Date;@Data 
public class UserBean {private String name;private Integer age;private Date birthday;private LocalDateTime createTime;private Boolean isDelete;
}

测试类:测试Jackson的序列化功能,即将Java对象转为Json字符串

java">public class TestJackson {public static UserBean getBean(){UserBean userBean = new UserBean();userBean.setName("zhi");userBean.setAge(18);userBean.setBirthday(new Date());userBean.setCreateTime(LocalDateTime.now());userBean.setIsDelete(false);return userBean;}public static void main(String[] args) {UserBean user = getBean();ObjectMapper objectMapper = new ObjectMapper();try {String userJsonStr = objectMapper.writeValueAsString(user);System.out.println(userJsonStr);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}
}

输出:

{"name":"zhi","age":18,"birthday":1735125463752,"createTime":{"dayOfWeek":"WEDNESDAY","dayOfYear":360,"year":2024,"month":"DECEMBER","nano":784000000,"monthValue":12,"dayOfMonth":25,"hour":19,"minute":17,"second":43,"chronology":{"calendarType":"iso8601","id":"ISO"}},"isDelete":false}

发现时间格式可读性差,想转换为2024-12-25 19:04:19类型。

修改:在实体类中添加注解

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
java">@Data
public class UserBean {private String name;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;private Boolean isDelete;
}

再次运行并输出

{"name":"zhi","age":18,"birthday":"2024-12-25 19:22:12","createTime":{"dayOfWeek":"WEDNESDAY","dayOfYear":360,"year":2024,"month":"DECEMBER","nano":851000000,"monthValue":12,"dayOfMonth":25,"hour":19,"minute":22,"second":12,"chronology":{"calendarType":"iso8601","id":"ISO"}},"isDelete":false}

发现birthday对了,但createTime不行。

继续修改

创建自定义LocalDateTime的序列化器:

java">import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/*** 自定义LocalDateTime的序列化器* 该序列化器用于将LocalDateTime对象转换为符合特定格式的JSON字符串*/
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {// 定义日期时间格式器,用于将LocalDateTime格式化为字符串// 格式为:年-月-日 时:分:秒 时区,时区为GMT+8private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8"));/*** 序列化LocalDateTime对象** @param localDateTime 待序列化的LocalDateTime对象* @param jsonGenerator 用于生成JSON数据的工具* @param serializerProvider 提供序列化器的工具,通常未使用* @throws IOException 当JSON生成过程中发生错误时抛出*/@Overridepublic void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {// 将LocalDateTime转换为带有GMT+8时区的ZonedDateTime对象ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("GMT+8"));// 使用定义好的格式器将ZonedDateTime格式化为字符串,并写入JSONjsonGenerator.writeString(zonedDateTime.format(formatter));}
}

在实体类中添加注解@JsonSerialize(using = XXX.class)

java">@Data
public class UserBean {private String name;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;@JsonSerialize(using = LocalDateTimeSerializer.class)private LocalDateTime createTime;private Boolean isDelete;
}

在此运行测试方法

{"name":"zhi","age":18,"birthday":"2024-12-25 19:31:20","createTime":"2024-12-25 19:31:20","isDelete":false}

成功!

不用注解的实现

两个序列化器

java">public class DateSerializer extends JsonSerializer<Date> {private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8"));@Overridepublic void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {// 将Date对象转换为ZonedDateTime对象ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.of("GMT+8"));// 将ZonedDateTime对象格式化为字符串String formattedDate = formatter.format(zonedDateTime);// 将格式化后的日期时间字符串写入JSON生成器jsonGenerator.writeString(formattedDate);}
}public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {// 定义日期时间格式器,用于将LocalDateTime格式化为字符串// 格式为:年-月-日 时:分:秒 时区,时区为GMT+8private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("GMT+8"));@Overridepublic void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {// 将LocalDateTime转换为带有GMT+8时区的ZonedDateTime对象ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("GMT+8"));// 使用定义好的格式器将ZonedDateTime格式化为字符串,并写入JSONjsonGenerator.writeString(zonedDateTime.format(formatter));}
}

实体类

java"> */
@Data
public class UserBean {private String name;private Integer age;private Date birthday;private LocalDateTime createTime;private Boolean isDelete;
}

测试方法

java">public class TestJackson {public static UserBean getBean(){UserBean userBean = new UserBean();userBean.setName("zhi");userBean.setAge(18);userBean.setBirthday(new Date());userBean.setCreateTime(LocalDateTime.now());userBean.setIsDelete(false);return userBean;}public static void main(String[] args) {UserBean user = getBean();ObjectMapper objectMapper = new ObjectMapper();// 配置ObjectMapper以处理LocalDateTime、Date类型的序列化JavaTimeModule javaTimeModule = new JavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());javaTimeModule.addSerializer(Date.class, new DateSerializer());objectMapper.registerModule(javaTimeModule);try {String userJsonStr = objectMapper.writeValueAsString(user);System.out.println(userJsonStr);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}
}

输出:
在这里插入图片描述
成功!


http://www.ppmy.cn/embedded/148853.html

相关文章

微软的AI转型故事

在一次备受瞩目的深度访谈中&#xff0c;微软的CEO萨提亚纳德拉与著名投资人比尔格里和布拉德格斯特纳展开了一场关于微软十年转型与AI未来的深入探讨。这次对话不仅回顾了微软在纳德拉领导下的重大发展轨迹&#xff0c;也为AI时代的战略布局提供了洞见。 纳德拉的职业起点 故…

openwrt 负载均衡方法 openwrt负载均衡本地源接口

openwrt 负载均衡方法 openwrt负载均衡本地源接口_mob6454cc647bdb的技术博客_51CTO博客 本人注重原理分析&#xff0c;要求对其原理掌握&#xff0c;否则按教程操作&#xff0c;你怕是什么都学不会&#xff0c;仔细看&#xff0c;认真记比较好。 首先确认一下基本细节 1、路由…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

智能网关在电力物联网中的应用

摘要 随着电力技术的快速发展&#xff0c;断路器从传统的单一保护功能演变为具备智能监控和远程管理能力的多功能设备。智能断路器作为配电系统的重要组成部分&#xff0c;集成了实时监测、远程控制和多层保护功能&#xff0c;显著提升了配电系统的安全性、稳定性和管理效率…

记我的Springboot2.6.4从集成swagger到springdoc的坎坷路~

项目背景 主要依赖及jdk信息&#xff1a; Springboot&#xff1a;2.6.4 Jdk: 1.8 最近新搭建了一套管理系统&#xff0c;前端部分没有公司的前端团队&#xff0c;自己在github上找了一个star较多使用相对也简单的框架。在这个管理系统搭建好上线之后&#xff0c;给组内的小伙…

在瑞芯微RK3588平台上使用RKNN部署YOLOv8Pose模型的C++实战指南

在人工智能和计算机视觉领域,人体姿态估计是一项极具挑战性的任务,它对于理解人类行为、增强人机交互等方面具有重要意义。YOLOv8Pose作为YOLO系列中的新成员,以其高效和准确性在人体姿态估计任务中脱颖而出。本文将详细介绍如何在瑞芯微RK3588平台上,使用RKNN(Rockchip N…

SAP HCM insufficient authorization, no.skipped personnel nos.可能涉及的场景

导读 授权不充分:HCM中有个权限对象P_ABAP,这个权限对象有个参数coars&#xff0c;如果设置成2&#xff0c;使用逻辑数据库就不会检查任何报表里面的结构化的权限&#xff0c;所以PA30找不到员工主数据&#xff0c;但是报表能查到对应的人&#xff0c;今天要分析的是工资核算结…

Docker、containerd、安全沙箱、社区Kata Containers运行对比

大家看了解决有意义、有帮助记得点赞加关注&#xff01;&#xff01;&#xff01; containerd、安全沙箱和Docker三种运行对比。 本文通过对比三种运行时的实现和使用限制、部署结构&#xff0c;帮助您根据需求场景了解并选择合适的容器运行。 一、容器运行时实现和使用限制…