Instanciar un tipo basado en JSON y metadatos usando Lift-Json
-
28-10-2019 - |
Pregunta
Me gustaría deserializar las clases de casos Scala que se han serializadas con Lift-Json. El problema que estoy teniendo es, no sé cómo invocar el método genérico extractOpt[A]
Método a continuación:
someString:String = {...}
JsonParser.parse(someString).extractOpt[A]
El tipo de [A]
dependerá de los metadatos, por ejemplo, el nombre de clase de [A]
Pero por la vida de mí no puedo averiguar cómo hacer la llamada usando la reflexión. En C# solo podría configurar el tipo genérico para una llamada extractOpt[A]
Usando reflexión. Me temo que mis problemas tienen algo que ver con el borrado de tipo Java.
Voy a tener muchas clases de casos, así que realmente quiero evitar tener que crear algún tipo de mapa hechos a mano de {metadatos} -> classof []. Tengo el control total sobre lo que los metadatos se asociaron con someString
es.
Si ayuda a entender por qué Tengo este problema, estoy implementando el abastecimiento de eventos, y todos mis tipos [A] serán eventos persistidos. ¿Alguna idea de lo que puedo hacer?
Solución
val json:JValue = JsonParser.parse(someString)
//typeName = classCanonicalName, ie this is the metadata
val eventType = Class.forName(typeName)
val deserialised:Event = Extraction.extract(json, TypeInfo(eventType,None)).asInstanceOf[Event]
Y para puntos de bonificación, ¿por qué presionar el botón 'hacer preguntas' en StackOverflow te lleva a poder pensar instantáneamente en una solución a tu propio problema? ;)