使用Jackson将Guava可选<integer>序列化为字符串

时间:2016-07-08 02:23:17

标签: java json jackson guava optional

我有一个带有Optional<Integer>字段的值对象。 我希望它在序列化时看起来像一个字符串,但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:expected [{“age”:“1”}]但找到[{“age”:“Optional.of(1)”}]

我一直在com.fasterxml.jackson.datatype.guava.ser.GuavaOptionalSerializer环顾四周,但我似乎无法弄清楚如何正确使用它,即使它意味着以这种方式使用。

我可以做些什么让这项测试有效?

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

1 个答案:

答案 0 :(得分: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;