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?

¿Fue útil?

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? ;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top