json scala serialization jackson case-class

json - Mapeador Jackson con clase genérica en scala



serialization case-class (2)

Debido a Java Erasure, Jackson no puede saber en tiempo de ejecución sobre el tipo genérico T de la línea,

mapper.readValue(response.body, classOf[GeneralResponse[GroupsForUserResult]])

Una solución a este problema será

mapper.readValue(json, new TypeReference[GeneralResponse[GroupsForUserResult]] {})

De esta forma, proporciona una instancia de TypeReference con toda la información de Tipo necesaria.

Estoy tratando de serializar GeneralResponse :

case class GeneralResponse[T](succeeded: Boolean, payload: Option[T])

y la carga útil es GroupsForUserResult :

case class GroupsForUserResult(groups: Seq[UUID]).

Estoy usando mapper.readValue(response.body, classOf[GeneralResponse[GroupsForUserResult]]) pero lamentablemente la carga se serializa como un Map y no como la clase de caso deseada ( GroupForUserResult ).


La respuesta aceptada es lo suficientemente cerca, pero también debe proporcionar el parámetro de tipo al método .readValue ,

Ejemplo de trabajo con prueba,

import com.fasterxml.jackson.core.`type`.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule import org.scalatest.{FunSuite, Matchers} case class Customer[T](name: String, address: String, metadata: T) case class Privileged(desc: String) class ObjectMapperSpecs extends FunSuite with Matchers { test("deserialises to case class") { val objectMapper = new ObjectMapper() .registerModule(DefaultScalaModule) val value1 = new TypeReference[Customer[Privileged]] {} val response = objectMapper.readValue[Customer[Privileged]]( """{ "name": "prayagupd", "address": "myaddress", "metadata": { "desc" : "some description" } } """.stripMargin, new TypeReference[Customer[Privileged]] {}) response.metadata.getClass shouldBe classOf[Privileged] response.metadata.desc shouldBe "some description" } }

La firma de com.fasterxml.jackson.databind.ObjectMapper#readValue ,

public <T> T readValue(String content, TypeReference valueTypeRef) throws IOException, JsonParseException, JsonMappingException { return (T) _readMapAndClose(_jsonFactory.createParser(content), _typeFactory.constructType(valueTypeRef)); }

Si no proporciona el parámetro de tipo, explotará con error. El Customer cannot be cast to scala.runtime.Nothing$