当前位置: 首页 > 知识库问答 >
问题:

如何将LocalDate字段转换为Json?

谭彦
2023-03-14

语境

我有控制器测试。我试图将对象UserDto转换为Json,使用的是Gson。

问题

Gson无法转换类型为LocalDate的字段生日。它向我显示错误消息:无法读取HTTP消息:org。springframework。http。转换器。HttpMessageNoteableException:JSON解析错误:意外标记(START\u对象),预期值\u字符串:预期数组或字符串。;嵌套异常为com。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:意外的标记(START\u对象),预期的值\u字符串:预期的数组或字符串。位于[源:(PushbackInputStream);第1行,第76列](通过引用链:com.user.management.domain.user[“生日”])

@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个答案

胡光霁
2023-03-14

不幸的是,GSON不支持本地日期时间,因此您需要创建自定义序列化,就像这里所做的那样https://stackoverflow.com/a/39193077/9091513

祝嘉懿
2023-03-14

在您的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;
 类似资料:
  • 我想把这个(字符串)s1转换成模式的LocalDate(LocalDate-dd/mm/yyy) 输出-25/07/1992应该是LocalDate类型,而不是字符串

  • 我使用Java 8的新DateTime API。 如何将LocalDate转换为Instant?我有个例外 我不明白为什么。

  • 我想将转换为,但由于某种原因无法转换。

  • 问题内容: 将JodaTime转换为对象的最简单方法是什么? 问题答案: 乔达时间 要将JodaTime转换为,请执行 要将JodaTime转换为,请执行 Java时间 要将Java8转换为,请执行 要将Java8转换为,请执行 您可能会想用来缩短它,但是没有直接的API可以获取系统默认的区域偏移量。 要将Java8转换为,请执行

  • 在Java8中,如何将(在中)转换为(在中)?

  • 问题内容: 如何指定格式字符串以将日期单独转换为字符串。就我而言,只有日期部分是相关的 将其构造为失败: 有错误 可能是因为我应该改用。但是,我看不到任何格式化程序。什么是转换的最佳方式进入(或别的东西,如果这是不正确的表示) 谢谢… 问题答案: 您可能正在寻找。这有点令人困惑,因为它采用了通用类型,但是文档指出如果将a 传递给构造函数,它将使用一个知道如何处理a的a ,例如