Gson setDateFormat исключает, когда дата равна нулю

Я построил экземпляр Gson как:

val DATE_FORMAT_MASK = "yyyy-MM-dd'T'HH:mm:ssZ" val gson = GsonBuilder() .setDateFormat(DATE_FORMAT_MASK) .create() 

Это работает правильно, пока я не выполнил сериализацию нулевой даты

 gson.toJson(null, Date::class.java) 

Тогда я получаю следующее исключение:

 java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:1770) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:943) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936) at java.text.DateFormat.format(DateFormat.java:345) at com.google.gson.DefaultDateTypeAdapter.write(DefaultDateTypeAdapter.java:88) at com.google.gson.DefaultDateTypeAdapter.write(DefaultDateTypeAdapter.java:40) at com.google.gson.Gson.toJson(Gson.java:669) at com.google.gson.Gson.toJson(Gson.java:648) at com.google.gson.Gson.toJson(Gson.java:603) 

Как я могу справиться с этой ситуацией?

Может быть, ошибка в библиотеке Gson?

Я действительно setDateFormat что setDateFormat не обрабатывает нулевую сериализацию. Я думаю, вы вынуждены внедрять адаптеры типов:

 val gson = GsonBuilder() //.setDateFormat(DATE_FORMAT_MASK) .registerTypeAdapter(Date::class.java, JsonSerializer<Date> { date: Date?, type, context -> val parsed = date?.toString(DATE_FORMAT_MASK) if(parsed == null) null else context?.serialize(parsed) }) .registerTypeAdapter(Date::class.java, JsonDeserializer<Date> { json: JsonElement?, type, context -> json?.asString?.toDate(DATE_FORMAT_MASK) }) .create() 

Где toDate и toString :

 fun Date.toString(mask: String): String? { try { val simpleDateFormat = SimpleDateFormat(mask, Locale.getDefault()) return simpleDateFormat.format(this) } catch (ignored: Exception) { return null } } fun String.toDate(mask: String): Date? { return try { val simpleDateFormat = SimpleDateFormat(mask, Locale.getDefault()) simpleDateFormat.parse(this) } catch (ignored: Exception) { null } } 

Это охватывает следующий тест:

 data class DateWrapper(val date: Date?) @Test fun date_serialization() { val deserializedDate = gson.fromJson("\"2017-10-23T12:48:43+0200\"", Date::class.java) assertNotNull(deserializedDate) val deserializedNullDate = gson.fromJson("null", Date::class.java) assertNull(deserializedNullDate) val deserializedNullDate2 = gson.fromJson("", Date::class.java) assertNull(deserializedNullDate2) val deserializedDateWrapper = gson.fromJson("{date: null}", DateWrapper::class.java) assertNull(deserializedDateWrapper.date) val deserializedDateWrapper2 = gson.fromJson("{date: \"\"}", DateWrapper::class.java) assertNull(deserializedDateWrapper2.date) val deserializedDateWrapper3 = gson.fromJson("{}", DateWrapper::class.java) assertNull(deserializedDateWrapper3.date) val serializedDate = gson.toJson(Date(), Date::class.java) assertNotNull(serializedDate) val serializedNullDate = gson.toJson(null, Date::class.java) assertEquals("null", serializedNullDate) val date = Date() val serializedDateWrapper = gson.toJson(DateWrapper(date), DateWrapper::class.java) assertNotNull(serializedDateWrapper) val serializedDateWrapper2 = gson.toJson(DateWrapper(null), DateWrapper::class.java) assertNotNull(serializedDateWrapper2) }