【问题标题】:Using Jackson to serialize a Guava Optional<Integer> as a string使用 Jackson 将 Guava Optional<Integer> 序列化为字符串
【发布时间】:2016-07-08 02:23:16
【问题描述】:

我有一个带有Optional&lt;Integer&gt; 字段的值对象。 我希望它在序列化时看起来像一个字符串,但Optional 部分会妨碍它。

我有以下课程:

public class Person {
    private com.google.common.base.Optional<Integer> age;
    public com.google.common.base.Optional<Integer> getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = com.google.common.base.Optional.fromNullable(age);
    }
}

这是我的测试:

@Test
public void testPerson() throws Exception {
    ObjectMapper objectMapper = new ObjectMapper().registerModule(new GuavaModule());
    Person person = new Person();
    person.setAge(1);
    String jsonString = objectMapper.writeValueAsString(person);
    assertEquals(jsonString, "{\"age\":\"1\"}");
}

这个输出失败了:

java.lang.AssertionError: 预期 [{"age":"1"}] 但发现 [{"age":1}]

我尝试向属性添加@JsonSerialize 注释,如下所示:

@JsonSerialize(using = ToStringSerializer.class)
private com.google.common.base.Optional<Integer> age;

但是测试失败如下:

java.lang.AssertionError: 预期 [{"age":"1"}] 但发现 [{"age":"Optional.of(1)"}]

我一直在查看com.fasterxml.jackson.datatype.guava.ser.GuavaOptionalSerializer,但我似乎无法弄清楚如何正确使用它,即使它是按这种方式使用的。

我该怎么做才能让这个测试正常工作?

附:如果由我决定,我会完全删除 Optional,但这不是一个选项。

【问题讨论】:

  • 我认为你在GuavaOptionalSerializer 的正确轨道上,但我不知道如何使用注释正确设置它

标签: java json jackson guava optional


【解决方案1】:

我最终创建了自己的简单序列化程序:

public class OptionalStringSerializer extends JsonSerializer<Optional<Object>> {
    @Override
    public void serialize(Optional<Object> value, JsonGenerator gen,
            SerializerProvider serializers) throws IOException {
        gen.writeString(value.isPresent() ? value.get().toString() : null);
    }
}

我是这样指定的:

@JsonSerialize(using = OptionalStringSerializer.class)
private com.google.common.base.Optional<Integer> age;

【讨论】:

  • 另一种选择,因为在我看来在 Optional 上使用三元组似乎很奇怪:writeString(value.map(Object::toString).orElse(null))
  • map() 方法在 Guava 中不可用。
  • 啊,在头 JDK 的可选...我认为你可以使用 Optional#transformOptional.orNull 获得相同的结果。
  • @Jean-FrançoisSavard 是的,但这样更冗长。
猜你喜欢
  • 2020-05-20
  • 2016-01-02
  • 2015-10-25
  • 2021-05-11
  • 2018-07-24
  • 1970-01-01
  • 2017-10-09
  • 2021-01-01
  • 2022-01-08
相关资源
最近更新 更多