Jackson

Jackson 从类创建 JavaType

1、简介 使用 Jackson 时,或多或少都会遇到需要从给定的类(Class)对象中生成 JavaType 的情况。 本文将带你了解如何借助 Jackson 库从类创建 JavaType。 2、JavaType 和 Class 在了解详情之前,先来了解一下 JavaType 和 Class。 2.1、Java 中的 JavaType 在 Jackson 中,JavaType 类代表 Java 类型。它是一种机制,可以处理泛型和数组等通用类型。 创建 JavaType 实例非常重要,尤其是当我们在处理 JSON 时处理泛型结构。 2.2、Java 中的 Class 在 Java 中,Class 类是反射 API 的成员,在运行时用来表示类或接口。 此外,它还提供类的信息,包括名称、字段、方法和构造函数。 3、使用 TypeFactory 创建 JavaType 要使用 Jackson 从提供的 Class 对象生成 JavaType 实例,需要利用 TypeFactory 类。 TypeFactory 提供了一个默认实例,可以构建不同的类型,无论是泛型还是参数化类型。 以使用 TypeFactory 从泛型类生成 JavaType 对象为例: class MyGenericClass<T> { // Class 实现 } @Test void givenGenericClass_whenCreatingJavaType_thenJavaTypeNotNull() { Class<?

Spring Boot 自定义 Jackson ObjectMapper

1、概览 Spring Boot 默认使用 Jackson ObjectMapper 实例来序列化和反序列化 JSON 格式的响应与请求。 本文将带你了解如何在 Spring Boot 中自定义 Jackson ObjectMapper 选项,以及配置序列化和反序列化选项的最常用方法。 2、默认配置 默认情况下,Spring Boot 禁用了以下功能: MapperFeature.DEFAULT_VIEW_INCLUSION DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 从一个简单的例子开始: 客户端向 /coffee?name=Lavazza 端点发送 GET 请求。 Controller 返回一个新的 Coffee 对象。 Spring 使用 ObjectMapper 将 POJO 序列化为 JSON。 使用 String 和 LocalDateTime 对象来演示自定义选项: public class Coffee { private String name; private String brand; private LocalDateTime date; // get / set 省略 } 定义一个简单的 REST Controller 来演示序列化: @GetMapping("/coffee") public Coffee getCoffee( @RequestParam(required = false) String brand, @RequestParam(required = false) String name) { return new Coffee() .

Spring Boot 将 JSON 中的 Long 值序列化为 String 避免精度丢失

什么是精度丢失? Java 中长整形 Long (64位)的取值范围是:-9223372036854775808 - 9223372036854775807。 在这种情况下,由于 JavaScript 的 Number 类型是 64 位浮点数,它无法精确表示超过 53 位的整数。因此,当将 Java Long 类型的值传递给 JavaScript 时,可能会发生精度丢失。 你可以在浏览器控制台运行如下代码,更直观地感受 “精度丢失” 的问题。 let val = 9223372036854775807; console.log(val); //9223372036854776000 输出的值丢失了精度 如果我们在业务中使用 Long 作为数据类型,那么就必须要考虑浏览器客户端中 Js 存在精度丢失的问题。解决这个问题最简单的办法就是 把 Java 的 Long 值,序列化为字符串传递。 Jackson 的注解支持 Spring Boot 默认使用 Jackson 作为 JSON 的序列化、反序列化框架。Jackson 提供了 @JsonSerialize 注解,该注解的 using 属性可以指定一个 JsonSerializer 的实现类,用于自定义字段的序列化方式。 Jackson 已经预定义了一个实现 ToStringSerializer,用于把指定的字段序列化为字符串。 定义一个简单的 User 对象: package cn.springdoc.demo.model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; public class User { // 把 Long 类型的 id 序列化为 字符串 @JsonSerialize(using = ToStringSerializer.

在 Spring Boot 中自定义 Date/LocalDateTime/LocalDate 的序列化、反序列化格式

Spring Boot 中默认使用的 JSON 框架是 jackson,它负责把 JSON 请求体反序列化为 Java 对象,并把响应给客户端的 Java 对象序列化为 JSON 字符串。 本文将会详细介绍如何在 Spring Boot 应用中自定义 jackson 对 Date、LocalDateTime、LocalDate 等日期对象的序列化、反序列化格式。 Jackson 对 Date/LocalDateTime/LocalDate 的默认处理方式 为了处理 java.time 类型的日期类,你还需要在项目中添加 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 模块。 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> 默认情况下,Jackson 将 Date 对象序列化为时间戳。对于 LocalDateTime 和 LocalDate 对象,jackson 会序列化为一个 long[],其中,从第一个元素开始分别表示日期的:年、月、日、时、分、秒、毫秒。 示例: package cn.springdoc.test; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; public class JacksonTest { public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); // 注册 JavaTime 模块 objectMapper.