Gson setDateFormat hace exception cuando la date es nula

Construí mi instancia de Gson como:

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

Esto funciona correctamente hasta que ejecuto la serialization de una date nula

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

Entonces recibo la siguiente exception:

 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) 

¿Cómo puedo manejar esta situación?

Puede ser un error en la biblioteca Gson?

Realmente me asombró que setDateFormat no maneje la serialization nula. Creo que está obligado a implementar adaptadores de tipo:

 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() 

Donde toDate y toString son:

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

Esta cubierta te sigue la testing:

 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) } 
  • Clase de datos KotlinReflectionInternalError
  • Gradle no puede resolver references de otro module
  • Manera más limpia de reasignar el valor de la variable cuando la condición se cumple en Kotlin
  • Regla de Kotlin Proguard para enum?
  • La idea inteligente no se construye cuando presiono Ejecutar
  • Cadena de date de Android parsing dates ilegales - Kotlin
  • Comportamiento con Kotlin Higher-Order Functions e interfaces de método único?
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • El constructor de SAM networkingundante no se puede eliminar para la function declarada de Kotlin, pero funciona en la function declarada de Java
  • Cómo comparar el time de inactividad de MotionEvent con un reloj, ¿cuál es su base de time?
  • Log.e con Kotlin