使用 Jackson 将 Guava Optional<Integer> 序列化为字符串
Using Jackson to serialize a Guava Optional<Integer> as a string
我有一个带有 Optional<Integer>
字段的值对象。 我希望它在序列化时看起来像一个字符串,但是 Optional
部分妨碍了它。
我有以下 class:
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: expected [{"age":"1"}] but found [{"age":1}]
我试过向 属性 添加 @JsonSerialize
注释,如下所示:
@JsonSerialize(using = ToStringSerializer.class)
private com.google.common.base.Optional<Integer> age;
但是测试失败是这样的:
java.lang.AssertionError: expected [{"age":"1"}] but found [{"age":"Optional.of(1)"}]
我一直在 com.fasterxml.jackson.datatype.guava.ser.GuavaOptionalSerializer
中四处寻找,但我似乎无法弄清楚如何正确使用它,即使它应该以这种方式使用也是如此。
我该怎么做才能让这个测试正常工作?
P.S。如果由我决定,我会完全删除 Optional,但这不是一个选项。
我最终创建了自己的简单序列化程序:
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<Integer>
字段的值对象。 我希望它在序列化时看起来像一个字符串,但是 Optional
部分妨碍了它。
我有以下 class:
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: expected [{"age":"1"}] but found [{"age":1}]
我试过向 属性 添加 @JsonSerialize
注释,如下所示:
@JsonSerialize(using = ToStringSerializer.class)
private com.google.common.base.Optional<Integer> age;
但是测试失败是这样的:
java.lang.AssertionError: expected [{"age":"1"}] but found [{"age":"Optional.of(1)"}]
我一直在 com.fasterxml.jackson.datatype.guava.ser.GuavaOptionalSerializer
中四处寻找,但我似乎无法弄清楚如何正确使用它,即使它应该以这种方式使用也是如此。
我该怎么做才能让这个测试正常工作?
P.S。如果由我决定,我会完全删除 Optional,但这不是一个选项。
我最终创建了自己的简单序列化程序:
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;