反序列化guava可选<long>失败

时间:2018-03-26 15:03:41

标签: jackson jackson-databind

我使用jackson(版本:2.9.4)序列化一个guava可选项。

当我反序列化时,我会遇到异常:

Cannot deserialize instance of 'java.lang.Long' out START_OBJECT token.

当我在反序列化期间调试值时,我注意到值为&#34;可选(present = true)&#34;而不是Optional中的值。

我查看了对象映射器,&#34; GuavaModule()&#34;已经在对象映射器中注册。 如果我错过任何东西,请告诉我。

1 个答案:

答案 0 :(得分:1)

注册

的GuavaModule
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-guava</artifactId>
</dependency>

......以及以下的豆......

import com.google.common.base.Optional;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class GuavaBean {
    private Optional<Long> abc;
}

......这给了我一个绿色的考验......

import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
[…]
@Test
public void guava() throws JsonParseException, JsonMappingException, IOException  {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new GuavaModule());

    GuavaBean bean = new GuavaBean(Optional.of(9l));
    String beanSerialized = objectMapper.writeValueAsString(bean);
    assertThat(beanSerialized).isEqualTo("{\"abc\":9}");

    GuavaBean optLong = objectMapper.readValue(beanSerialized, GuavaBean.class);
    assertThat(optLong.getAbc().get()).isEqualTo(9);
}

但是,如果我不小心使用java.util.Optional代替com.google.common.base.Optional,那么beahviour就像你写的一样。