2016-07-08 64 views
2

我有一个Optional<Integer>字段值对象。 我希望它看起来像一个字符串,当它被序列化时,但Optional部分阻碍。使用杰克逊序列化番石榴可选<Integer>作为字符串

我有以下类:

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); 
    } 
} 

这里是我的测试:

java.lang.AssertionError: expected [{"age":"1"}] but found [{"age":1}]

我曾尝试加入@JsonSerialize注释:

@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\"}"); 
} 

它与该输出失败财产,如下所示:

@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.如果取决于我,我会完全删除可选项,但这不是一个选项。

+0

我认为你是正确的轨道'GuavaOptionalSerializer'上,但我不” t知道如何正确设置它使用注释 – njzk2

回答

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; 
+1

另一种方法,因为我的眼睛使用可选的writeString(value.map(Object :: toString).orElse(null))上的三元组似乎很奇怪 –

+0

map( )方法在Guava中不可用。 – mattalxndr

+0

啊,在JDK的头文件中可选...我想你可以使用'Optional#transform'和'Optional.orNull'来实现相同的结果。 –