Jackson在Spring Boot中的开发技巧详解

Jackson是Java应用程序中最常用的JSON处理库之一,它能将Java对象转换为JSON格式,也能将JSON反序列化为Java对象。在Spring Boot中,Jackson的使用非常广泛,并且Spring Boot默认配置已经包含了Jackson。本文将详细介绍Jackson在Spring Boot中的多种开发技巧。

1. 依赖引入

在Spring Boot项目中,Jackson通常作为spring-boot-starter-web的一部分被自动引入。因此,当项目中引入spring-boot-starter-web后,就不需要单独引入Jackson。不过,如果需要单独引入,可以添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
</dependency>
2. 注解使用

Jackson提供了多种注解,用于控制Java对象与JSON对象之间的转换过程。以下是常用的注解及其使用示例:

2.1 @JsonProperty

@JsonProperty注解用于指定JSON串中的属性名。如果Java对象中的属性名与JSON中的属性名不同,可以使用@JsonProperty注解进行指定。

java 复制代码
public class User {
    @JsonProperty("username")
    private String name;
    private Integer age;
    // 省略getter和setter
}

上面的代码表示,在将User对象转换为JSON格式时,name字段将被序列化成JSON串中的username属性。

2.2 @JsonIgnore

@JsonIgnore注解用于忽略某个字段,该字段不会被序列化到JSON中。

java 复制代码
public class User {
    private String name;
    @JsonIgnore
    private String password;
    // 省略getter和setter
}

上面的代码表示,在将User对象转换为JSON格式时,password字段将不会出现在JSON中。

2.3 @JsonInclude

@JsonInclude注解用于指定JSON序列化时包含哪些字段,以及如何处理空值。

java 复制代码
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
    private String name;
    private Integer age;
    private String phone;
    // 省略getter和setter
}

上面的代码表示,在将User对象转换为JSON格式时,如果age字段的值为null,那么这个字段将不会出现在JSON中。而如果phone字段的值为null,这个字段将会出现在JSON中,但是它的值将为null。

2.4 @JsonFormat

@JsonFormat注解用于格式化日期类型字段。

java 复制代码
public class User {
    private Long id;
    @JsonProperty("username")
    private String name;
    private Integer age;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", locale="zh", timezone="GMT+8")
    private Date birthday;
    // 省略getter和setter
}

上面的代码表示,在将User对象转换为JSON格式时,birthday字段将按照指定的日期格式进行序列化。

2.5 @JsonTypeInfo 和 @JsonSubTypes

这两个注解用于处理多态类型的序列化与反序列化。

java 复制代码
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.EXISTING_PROPERTY, visible=true, property="type")
@JsonSubTypes({
    @JsonSubTypes.Type(value=DncCheckBox.class, name="CHECKBOX"),
    @JsonSubTypes.Type(value=DncDate.class, name="DATE"),
    // 其他实现类
})
public abstract class DocNoComponent {
    public String type;
    // 其他属性和方法
}

上面的代码表示,在序列化时,会根据type字段的值来判断具体的实现类,并在反序列化时根据这个值来实例化对应的类。

3. 全局配置

除了使用注解进行字段级别的配置外,还可以通过Spring Boot的配置文件对Jackson进行全局配置。

3.1 日期格式化

可以在配置文件中指定日期类型的全局格式化规则:

yaml 复制代码
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
3.2 Long型字段转字符串

为了避免JavaScript在处理Long型字段时可能出现的精度丢失问题,可以将Long型字段序列化为字符串:

yaml 复制代码
spring:
  jackson:
    default-property-inclusion: non_null
    serialization:
      write_bigdecimal_as_plain: true

或者在字段级别使用@JsonFormat注解:

java 复制代码
public class MyClass {
    @JsonFormat(shape=JsonFormat.Shape.STRING)
    private Long lng;
    // 其他属性和方法
}
4. 自定义序列化与反序列化

如果Jackson提供的注解和全局配置无法满足需求,还可以通过自定义序列化器和反序列化器来实现更复杂的功能。

4.1 自定义序列化器
java 复制代码
public class CustomDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = sdf.format(date);
        gen.writeString(formattedDate);
    }
}

然后在Java类中使用@JsonSerialize注解来指定自定义序列化器:

java 复制代码
public class User {
    private Long id;
    private String name;
    
    @JsonSerialize(using = CustomDateSerializer.class)
    private Date birthday;
    // 省略getter和setter
}
4.2 自定义反序列化器
java 复制代码
public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        String date = node.asText();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

然后在Java类中使用@JsonDeserialize注解来指定自定义反序列化器:

java 复制代码
public class User {
    private Long id;
    private String name;
    
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date birthday;
    // 省略getter和setter
}

通过以上介绍,相信你已经对Jackson在Spring Boot中的使用有了更深入的了解。这些技巧将帮助你更好地处理JSON数据的序列化和反序列化,提高开发效率。

相关推荐
BK贝壳4 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949655 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
喵了几个咪8 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt8 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
学长毕设8 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
在世修行9 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_9628857210 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI10 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
_孤傲_10 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
信誓旦旦的程序猿11 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口