Skip to content

Jackson 3-使用Optional类型

本文主要介绍了如何在Jackson中处理Optional类型。参考链接:https://www.baeldung.com/jackson-optional。

首先准备测试程序:

java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    private String title;
    private Optional<String> subTitle;
}
java
@Test
void test() throws JsonProcessingException {
    Book book = new Book("读者", Optional.of("副标题"));

    ObjectMapper objectMapper = new ObjectMapper();
    String jsonString = objectMapper.writeValueAsString(book);

    System.out.println(jsonString);
}

运行上述代码,控制台报错:

DANGER

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 optional type java.util.Optional<java.lang.String> not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jdk8" to enable handling (through reference chain: org.example.entity.Book["subTitle"])

根据提示提示,我们需要添加jackson-datatype-jdk8模块。

xml
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.18.2</version>
</dependency>

然后,还需要在ObjectMapper实例上注册JDK8类型模块。

java
objectMapper.registerModule(new Jdk8Module());

现在我们就可以顺利输出JSON字符串了:

txt
{"title":"读者","subTitle":"副标题"}

我们也可以进行反序列化:

java
@Test
void test02() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new Jdk8Module());

    String jsonString = "{\"title\":\"读者\",\"subTitle\":null}";

    Book book = objectMapper.readValue(jsonString, Book.class);
    System.out.println(book);
}
txt
Book(title=读者, subTitle=Optional.empty)