En Kotlin, error de deserialization de Jackson con class de datos

No estoy seguro de cuál es la mejor manera de explicar el problema, así que preparé el mismo código que para java y kotlin para una mejor demostración.

Cuando leo JSON, parece que está obligando a un valor de beans de datos a ser NULL aunque el parámetro ni siquiera forma parte de json para empezar y el bean de datos pnetworkingetermina el valor del campo faltante. En Java, funciona correctamente y nunca intenta anular el valor que nunca se proporcionó para empezar. En Kotlin parece romperse porque intenta anular un campo que no admite nulos.

En Kotlin

data class Pojo(val name: String, val age: Int, val list: List<String> = emptyList(), val ts: Date = Date()) private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) fun main(args: Array<String>) { mapper.readValue("""{"name": "John Doe", "list": ["yellow", "green"], "age": 42}""", Pojo::class.java) } 

Lo cual arroja una exception de

 java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Pojo.<init>, parameter ts 

En Java (todo funciona bien)

 public class Transform { private static ObjectMapper mapper = new ObjectMapper() .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); public static class Pojo { private String name; private int age; private List<String> list; private Date ts = new Date(); <getters and setters for all> } public static void main(String[] args) throws IOException { String json = "{\"name\": \"John Doe\", \"list\": [\"yellow\", \"green\"], \"age\": 42}"; Pojo p = mapper.readValue(json, Pojo.class); System.out.printf("Bean: name=%s, age=%s, list=%s, ts=%s\n", p.name, p.age, p.list, p.ts); } } 

Incluso si lo hago una class en lugar de una class de datos en kotlin, sigue cometiendo errores de la misma manera.

Mi pregunta es, ¿cómo puedo get la deserialization de Jackson para trabajar en Kotlin con mis POJO? El comportamiento esperado es que "debería" romperse si se pasa un valor nulo / incorrecto para algo donde null no está permitido. Pero en el escenario anterior donde no se hizo ningún bash para cambiar el campo ts a nulo, debería haber usado el valor pnetworkingeterminado como lo hace con java.

Lo único que cruza mi mente que parece funcionar es no usar el concepto del frijol de datos en absoluto y escribir mis frijoles como

 class Pojo(val name: String, val age: Int) { var list: List<String> = emptyList() var ts: Date = Date() } 

Pero entonces mi .equals no funciona y permite que otros usuarios remotos manipulen el contenido de la list y las properties de ts cuando quiero que sean de solo lectura.

Con la versión 2.8.0 de jackson-kotlin-module es:

ahora admite el uso de valores pnetworkingeterminados en los methods de constructor y creador

El siguiente ejemplo muestra la característica:

 data class Question(val title: String = "Is programming hard?", val answer: String) val q = mapper.readValue<Question>("""{"answer": "Sure it can be"}""") println(q) //-> Question(title=Is programming hard?, answer=Sure it can be) 

Creo que una de tus properties entrantes es nula, ¿así que vas a necesitar ubicarla ? después de jsonProperty que podría ser nulo (en este caso, este es su campo de date). También puede usar el tipo de datos de Cadena sin procesar para su testing con comillas triples """\unescaped string""" por lo que debería ser como este val ts: Date? dentro de tu class de datos Y no es necesario networkingeclarar el tipo. Entonces, la respuesta final sería: data class Pojo(val name: String, val age: Int, val list: List<String>, val ts: Date?)

  • RxJava2 cómo separar diferentes implementaciones de emisor observable
  • ¿Cómo get una class de time de ejecución de una variable en Kotlin?
  • ¿Cómo recuperar datos de una database de Firebase y almacenarlos en un ListArray <Class>? - Kotlin
  • ¿Cómo corregir la ambigüedad de resolución de sobrecarga en Kotlin (sin lambda)?
  • En Android Java / Kotlin, ¿la implementación de una interfaz le da acceso directo a las variables locales de la class de anidación?
  • ¿Cómo puedo inicializar la variable antes de cada testing usando el marco kotlin-test
  • java.lang.NoClassDefFoundError en Kotlin
  • Referencia no resuelta de Kotlin: println de gradle en la CLI
  • Tipo no coincidente: ¿tipo inferido es FragmentActivity? pero se esperaba Context al actualizar la biblioteca de soporte a 27.0.0
  • ¿Cómo usar la anotación Swagger @ApiResponses en Kotlin?
  • La instancia de fragment se conserva pero el fragment hijo no se vuelve a adjuntar