如何将LocalDate字段转换为Json?

时间:2018-04-18 10:55:32

标签: json testing gson

上下文

我有控制器测试。我尝试使用Gson将对象UserDto转换为Json。

问题

Gson无法转换类型为LocalDate的字段生日。它显示错误消息:无法读取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException:JSON解析错误:意外的令牌(START_OBJECT),预期的VALUE_STRING:预期的数组或字符串。嵌套异常是com.fasterxml.jackson.databind.exc.MismatchedInputException:意外的标记(START_OBJECT),预期的VALUE_STRING:预期的数组或字符串。  在[来源:( PushbackInputStream); line:1,column:76](通过参考链:com.user.management.domain.User [" birthday"])

@Test
public void createUser() throws Exception {
    //Given
    GroupOfUser groupOfUser = new GroupOfUser();
    groupOfUser.setId(1L);
    groupOfUser.setName("test_name");
    User user = new User();
    user.setId(1L);
    user.setFirstName("test_firstName");
    user.setLastName("test_lastName");
    user.setBirthday(LocalDate.of(2011,1,1));
    user.getGroupOfUsers().add(groupOfUser);
    Gson gson = new Gson();
    String jsonContent = gson.toJson(user);
    when(userService.saveUser(any(User.class))).thenReturn(user);
    //When && Then
    mockMvc.perform(post("/v1/users")
            .contentType(MediaType.APPLICATION_JSON)
            .characterEncoding("UTF-8")
            .content(jsonContent))
            /*.andExpect(jsonPath("$.id",is(1)))*/
            .andExpect(jsonPath("$.firstName", is("test_firstName")))
            .andExpect(jsonPath("$.lastName", is("test_lastName")))
            .andExpect(jsonPath("$.date", is(2018 - 1 - 1)));
}

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

包含在您的pom.xml中:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

然后在您的User.java导入ToStringSerializer中,如下所示:

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 

最后,总是在您的User.java文件中,对感兴趣的日期进行如下注释:

@JsonSerialize(using = ToStringSerializer.class) 
private LocalDate birthday;

答案 1 :(得分:0)

不幸的是,GSON没有本地日期时间的support,因此您将需要创建自定义序列化,就像这里的https://stackoverflow.com/a/39193077/9091513