【发布时间】:2017-03-17 10:15:23
【问题描述】:
我有一个带有 Optional 字段的 Java 类。我正在使用 Jackson 2.8.3(从 Spring web 4.3.3 调用)将类序列化为 JSON。
如果 Optional 为空,我希望让序列化程序跳过该字段,并序列化包含的字符串(如果存在)。我正在寻找包含两个对象的列表的结果示例:
[
{
"id": 1,
"foo": "bar"
},
{
"id": 2,
}
]
对于 id 为 2 的对象,这里的 foo Optional 为空。
相反,我得到的是:
[
{
"id": 1,
"foo": {
"present": true
}
},
{
"id": 2,
"foo": {
"present": false
}
}
]
即使我在类中注释“栏”字段,这也是结果
@JsonInclude(JsonInclude.Include.NON_ABSENT)
public Optional<String> getFoo() { ...
有没有什么方法可以使用 Jackson 注释或自定义序列化程序来实现第一个列表之类的结果?
【问题讨论】:
-
顺便说一句,使用
Optional作为 bean 的字段通常是一个 Bad Idea™。 -
为什么这被认为是有问题的?
-
它不是为这种用途而设计的。这是一个非常微妙的语义差异,但在字段的情况下,
null被认为只是另一个值。如果您在库的 API 中设计方法,您可能需要强调它可能不会返回值,因此使用Optional。查看更多here
标签: java json serialization spring-boot jackson