我正在使用 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/