Gson испортил значение минут - PullRequest
2 голосов
/ 27 мая 2020

Я использую gson для преобразования сериализованного сообщения в объект, но у меня проблема с преобразованием одного атрибута в java.sql.Timestamp

Атрибут времени начала в JSON равен

{...other_fields, "start_time": "2020-05-27 05:23:43.022610"}

И мой парсер Gson инициализируется таким образом

new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss.S").create();

Объект анализируется правильно, но время начала имеет разные значения минут и секунд, как и должно. Результатом времени начала синтаксического анализа является: 2020-05-27 05:24:05.61

Что мне не хватает?

Edit1 :

Java Версия: 1.8
Версия Gson: 2.8.2

Edit2 :

После изменения формата на yyyy-MM-dd HH:mm:ss (без миллисекунд) I получил правильный результат, но без значения миллисекунд. Я могу смириться с этим, но было бы неплохо, если бы кто-нибудь все еще мог объяснить эту проблему.

1 Ответ

2 голосов
/ 27 мая 2020

GsonBuilder.setDateFormat() использует SimpleDateFormat.

И SimpleDateFormat не поддерживает микросекунды во время синтаксического анализа. S обозначает миллисекунды, что означает только 3 знака после запятой.

Это можно доказать. В вашем JSON удалите микросекунды и используйте 2020-05-27 05:23:43.022 в качестве ввода.

Результат будет

2020-05-27 05: 23: 43.022

Timestamp поддерживает микросекунды, и если вы хотите преобразовать 2020-05-27 05:23:43.022610 (с микросекундами) в Timestamp, вам лучше написать настраиваемый десериализатор GSON

Изменить: образец десериализатора для отметки времени

class TimestampDeserializer implements JsonDeserializer<Timestamp> {

    @Override
    public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // Handle null checks or format check, etc.
        return Timestamp.valueOf(json.getAsString());
    }
}

Использование:

Gson gson = new GsonBuilder().serializeNulls().registerTypeAdapter(Timestamp.class, new TimestampDeserializer()).create();
...