Java Jackson无法解析ISO8601

Java Jackson无法解析ISO8601,java,json,spring-boot,jackson,Java,Json,Spring Boot,Jackson,我们得到了一个带有日期作为一个json属性的HttpResponse,日期的格式为ISO8601(例如2020-03-13T00:00:35.570+0000),但Jackson抛出以下异常: java.time.format.DateTimeParseException:无法在索引23处分析文本“2020-03-13T00:00:35.570+0000” 我写了下面的测试(spock),它无法复制。 我需要知道如何解析日期。 谢谢你的帮助 class TestJackson extends S

我们得到了一个带有日期作为一个json属性的HttpResponse,日期的格式为ISO8601(例如2020-03-13T00:00:35.570+0000),但Jackson抛出以下异常:

java.time.format.DateTimeParseException:无法在索引23处分析文本“2020-03-13T00:00:35.570+0000”

我写了下面的测试(spock),它无法复制。 我需要知道如何解析日期。 谢谢你的帮助

class TestJackson extends Specification{

    def 'test date format'(){
        given:
        def jsonString = """{"myDate":"2020-03-13T00:00:35.570+0000"}"""

        and:
        def objectMapper = new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .enable(SerializationFeature.INDENT_OUTPUT)
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        when:
        def resp = objectMapper.readValue(jsonString, Response)

        then:
        resp.myDate != null
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Response {
        ZonedDateTime myDate
    }
}

该测试使用以下依赖项:

  • 核心:jackson数据绑定:2.10.3
  • 数据类型:jackson-datatype-jsr310:2.10.3

    • 杰克逊不是这里的问题;如果调用
      ZoneDateTime.parse(“2020-03-13T00:00:35.570+0000”)
      ,也会出现同样的异常。根据,
      ZonedDateTime
      使用
      DateTimeFormatter.ISO_ZONED_DATE_TIME
      进行解析<代码>ISO分区日期时间

      带有偏移量和区域的日期时间,例如 “2011-12-03T10:15:30+01:00[欧洲/巴黎]”

      您试图解析的值有偏移量,但没有区域,因此需要将其转换为,这将使用
      DateTimeFormatter.ISO\u offset\u DATE\u TIME
      进行解析<代码>日期时间格式。ISO_偏移量_日期_时间

      …解析带有偏移量的日期时间,例如“2011-12-03T10:15:30+01:00”


      尝试将
      ZonedDateTime
      更改为
      OffsetDateTime
      。例外来自Java,而不是Jackson。就这样,谢谢:我会写一个更详细的答案,很高兴它成功了!