Десериализация Java 8 LocalDateTime с использованием gson - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу десериализовать строку json, содержащую поля LocalDateTime, в класс с помощью gson.

Но это вызывает исключение нулевого указателя.

Мой JSON:

metrics": {
"measurements": [
{
"serviceName": "myService",
"start": {
"year": 2018,
"month": "APRIL",
"dayOfMonth": 26,
"dayOfWeek": "THURSDAY",
"dayOfYear": 116,
"monthValue": 4,
"hour": 18,
"minute": 53,
"second": 51,
"nano": 243000000,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
"stop": {
"year": 2018,
"month": "APRIL",
"dayOfMonth": 26,
"dayOfWeek": "THURSDAY",
"dayOfYear": 116,
"monthValue": 4,
"hour": 18,
"minute": 53,
"second": 51,
"nano": 841000000,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
"processingTime": 598
}

Код, который я использую для получения моего объекта:

Metrics metrics = gson.fromJson(jsonString, Metrics.class);

Но gson может десериализовать только поле processingTime моего объекта.

Я тоже это пробовал:

Java 8 LocalDateTime десериализовано с использованием Gson

но это приводит к

Caused by: java.lang.IllegalStateException: This is not a JSON Primitive.
    at com.google.gson.JsonElement.getAsJsonPrimitive(JsonElement.java:122)
    at com.foo.config.AppConfig.lambda$gson$1(AppConfig.java:63)

есть мысли?

Спасибо

1 Ответ

0 голосов
/ 02 мая 2018

Я смог решить ее самостоятельно, помогая адаптеру типа LocalDateTime:

   @Bean
    public Gson gson() {
        return new GsonBuilder()
                .registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
                    @Override
                    public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
                        JsonObject jo = json.getAsJsonObject();
                        return LocalDateTime.of(jo.get("year").getAsInt(),
                                jo.get("monthValue").getAsInt(),
                                jo.get("dayOfMonth").getAsInt(),
                                jo.get("hour").getAsInt(),
                                jo.get("minute").getAsInt(),
                                jo.get("second").getAsInt(),
                                jo.get("nano").getAsInt());
                    }
                }).create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...