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数据的序列化和反序列化,提高开发效率。

相关推荐
鹏码纵横2 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz2 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
weixin_985432112 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
猎人everest3 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest3 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18404 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.4 小时前
Python Day50
开发语言·python
xiaohanbao094 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿5 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python