Использование шаблона Джексона JsonFormat для пользовательской строки даты - PullRequest
1 голос
/ 20 марта 2020

Сводка

Я пытаюсь разобрать даты, например 25/Sep/17, поэтому аннотация SimpleDateFormat выглядит как @JsonFormat(pattern = "dd/MMM/yy"). Однако, когда я пытаюсь разобрать это, я получаю InvalidFormatException, где суть (полное исключение ниже после примера):

Text '25/Sep/17' could not be parsed at index 3

Что не так с моей строкой формата даты? Я не вижу никаких проблем. Похоже, что ему не нравится Sep в паре с MMM.

Я использую Amazon Corretto Java версия "11.0.5" 2019-10-15 LTS

Пример для воспроизведения

package example;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.time.LocalDate;

public class HelloMapperApp {
  private static final ObjectMapper MAPPER = new ObjectMapper();

  public static void main(String[] args) {
    MAPPER.registerModule(new JavaTimeModule());
    try {
      Example example = MAPPER.readValue("{ \"name\": \"example\", \"date\": \"25/Sep/17\"", Example.class);
      System.out.println("Deserialised is: " + example);
    } catch (Exception e) {
      throw new RuntimeException("Could not parse JSON: " + e);
    }
  }

  static class Example {
    @JsonProperty
    String name;
    @JsonProperty
    @JsonFormat(pattern = "dd/MMM/yy")
    LocalDate date;

    @Override
    public String toString() {
      return String.format("name: %s%ndate: %s", name, date);
    }
  }
}

Полное исключение

Exception in thread "main" java.lang.RuntimeException: Could not parse JSON: com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Cannot deserialize value of type 
`java.time.LocalDate` from String "25/Sep/17": Failed to deserialize java.time.LocalDate: 
(java.time.format.DateTimeParseException) Text '25/Sep/17' could not be parsed at index 3
 at [Source: (String)"{ "name": "example", "date": "25/Sep/17""; line: 1, column: 30] (through reference chain: example.HelloMapperApp$Example["date"])
        at example.HelloMapperApp.main(HelloMapperApp.java:19)

1 Ответ

0 голосов
/ 20 марта 2020

Возможно, данный ввод имеет неправильный формат для локали, используемой форматтером. Здесь - аналогичный пост, где у кого-то возникла проблема с Sep, где форматер ожидал Sep. для Locale.CANADA.

Здесь и здесь Вы можете проверить, как установить локаль для форматера. Например:

@JsonFormat(locale = "en", pattern = "dd/MMM/yy")

К вашему сведению: вам не нужно использовать LLL в течение нескольких месяцев в качестве текста. Посмотрите на DateTimeFormatter .

Число / Текст: Если количество букв образца 3 или больше, используйте приведенные выше правила текста. В противном случае используйте приведенные выше правила нумерации.

Когда вы используете MMM, то есть три раза M, форматер будет неявно использовать текстовый формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...