Как сериализовать LocalDate с помощью Gson? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующее POJO :

public class Round {

    private ObjectId _id;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    @Getter
    @Setter
    @Accessors(fluent = true)
    @JsonProperty("date")
    private LocalDate date;

    // rest of fields

}

Метод сериализации для преобразования POJO в JSON:

public static String toJson(Object object){
    return new Gson().toJson(object);
}

Однако когда я вызываю метод toJson, как показано ниже:

     Round round = new Round()
            .userId("user3")
            .course("course 1")
            .date(LocalDate.now())
            .notes("none");
    }

     return MockMvcRequestBuilders
                .post("/rounds")
                .accept(MediaType.APPLICATION_JSON)
                .content(TestHelper.toJson(round))
                .contentType(MediaType.APPLICATION_JSON);

я получаю ошибку: com.faster xml .jackson.databind.ex c .MismatchedInputException , которая ссылается на в поле date POJO:

2020-04-25 21:19:22.269  WARN 6360 --- [           main] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string.
     at [Source: (PushbackInputStream); line: 1, column: 47] (through reference chain: com.ryd.golfstats.golfstats.model.Round["date"])]

Как правильно сериализовать поле LocalDate, используя Gson?

1 Ответ

1 голос
/ 26 апреля 2020

Ваш POJO использует аннотации из библиотеки Джексона JSON, поэтому вы должны использовать его средства для сериализации LocalDate, и тогда все будет работать нормально:

Round r = new Round();
r.set_id(1);
r.setDate(LocalDate.now());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
String rjson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(r);
System.out.println(rjson);

производит:

{
  "_id" : 1,
  "date" : "26-04-2020"
}

Если вам по какой-то причине необходимо использовать Gson, вы можете просмотреть этот ответ , предоставить адаптер для LocalDate и зарегистрировать его в Gson:

class LocalDateAdapter implements JsonSerializer<LocalDate> {

    public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // "yyyy-mm-dd"
    }
}
// -------
Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
        .create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...