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。不过,如果需要单独引入,可以添加以下依赖:

<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注解进行指定。

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

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

2.2 @JsonIgnore

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

public class User {
    private String name;
    @JsonIgnore
    private String password;
    // 省略getter和setter
}

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

2.3 @JsonInclude

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

@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注解用于格式化日期类型字段。

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

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

@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 日期格式化

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

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

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

spring:
  jackson:
    default-property-inclusion: non_null
    serialization:
      write_bigdecimal_as_plain: true

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

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

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

4.1 自定义序列化器
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注解来指定自定义序列化器:

public class User {
    private Long id;
    private String name;
    
    @JsonSerialize(using = CustomDateSerializer.class)
    private Date birthday;
    // 省略getter和setter
}
4.2 自定义反序列化器
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注解来指定自定义反序列化器:

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

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

10-19 19:52