java - 具有可选字段的不可变值类的 Jackson 序列化

标签 java jackson immutables-library

我正在使用 Immutables 库 ( https://immutables.github.io )。

我的类(class)如下所示:

package com.abc.myservice.data.models;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.immutables.value.Value;

import java.util.Map;
import java.util.Optional;

@Value.Immutable
@JsonSerialize(as = ImmutableMyEntityModel.class)
@JsonDeserialize(as = ImmutableMyEntityModel.class)
public interface MyEntityModel {
    String myEntityId();
    String status();
    Optional<Integer> count();
    Optional<Integer> version();
    Optional<Map<String, String>> attributes();
}

我使用以下方法构建不可变类对象:

ImmutableMyEntityModel.builder()
    .myEntityId("some-id")
    .status("some-status")
    .count(Optional.of(10))
    .build()

我的输出是:

{
    "MyEntityId": "some-id",
    "status": "some-status",
    "count": {
        "present": true
    },
    "version": {
        "present": false
    },
    "attributes": {
        "present": false
    }
}

相反,我想看到的是:

{
    "MyEntityId": "some-id",
    "status": "some-status",
    "count": 10
}

我怎样才能让它像这样工作?

最佳答案

使用jackson-datatype-jdk8模块,以便Jackson正确理解java.util.Optional类型 - 一个很好的解释在this article中.


  • 添加jackson-datatype-jdk8库到您的项目/类路径,其中包含 Jackson 模块,使 Jackson 能够正确理解可选。
  • 创建 ObjectMapper 时,注册 Jdk8Module:
ObjectMapper om = new ObjectMapper();
om.registerModule(new Jdk8Module());
  • (可选)将 @JsonIgnoreProperties(ignoreUnknown = true) 添加到属性或类本身,以避免将 Optional.empty() 序列化为 null 值,而是完全忽略该属性.

完整示例:

public class JacksonOptionalTest
{
    public static void main(String... args)
    throws Exception
    {
        ObjectMapper om = new ObjectMapper();
        om.registerModule(new Jdk8Module());

        Thing thing = new Thing();
        thing.name = "John Smith";
        thing.count = Optional.of(12);

        String s = om.writeValueAsString(thing);
        System.out.println(s);
    }

    @JsonInclude(Include.NON_ABSENT)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Thing
    {
        public String name;
        public Optional<Integer> count = Optional.empty();
        public Optional<Integer> version = Optional.empty();
    }
}

其输出为{"name":"John Smith","count":12}

关于java - 具有可选字段的不可变值类的 Jackson 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69532507/

相关文章:

具有返回类型的 Java 方法在没有返回语句的情况下编译

java - 使用 Jackson 将 JSON 反序列化为多态类型 - 一个完整的示例给了我一个编译错误

java - Jackson 子类序列化

java - 无法配置 IntelliJ Idea 使用 @Immutables 注释

java - 无法正常启动hadoop datanode

java - BouncyCaSTLe 签名值与 dotNET 签名值不匹配

jaxb 解码器 : repeated xmlelement without wrapper

java - 注释从 Immutables 接口(interface)奇怪地传递到实现

java - 无法使用在 JTable UI 编程中扩展 AbstractTableModel 的类中声明的方法

java - Spring MVC 4.0中JSON表单参数的自动转换