Search code examples
jsonscalagenericsjackson

Trying to use Jackson to read value to a parameterized type with scala


I'm trying to write a method that will allow Jackson ObjectMapper readValue on a json string to a parameterized object type. Something like this

case class MyObj(field1: String, field2: String)

val objectMapper: ObjectMapper = new ObjectMapper().registerModule(new DefaultScalaModule)

def fromJson[T](jsonString: String, objTyp: T): T = {

    objectMapper.readValue(jsonString, classOf[T])

}

val x = fromJson("""{"field1": "something", "field2": "something"}""", MyObj)

This of course returns an error of

class type required but T found

i've looked at this issue Scala classOf for type parameter but it doesn't seem to help. It seems like this is possible to do somehow. Looking for any help


Solution

  • You have to give it the actual runtime class to parse into, not just a type parameter.

    One way to do it is passing the class directly:

    def fromJson[T](json: String, clazz: Class[T]) = objectMapper.readValue[T](json, clazz)
    
    val x = fromJson("""...""", classOf[MyObj])
    

    Alternatively, you can use ClassTag, which looks a bit messier in implementation, but kinda prettier at call site:

    def fromJson[T : ClassTag](json: String): T = objectMapper.readValue[T](
      json, 
      implicitly[ClassTag[T]].runtimeClass.asInstanceOf[Class[T]]
    )
    
    val x = fromJson[MyObj]("""{"field1": "something", "field2": "something"}""")