Domanda

Vorrei deserializzare le classi di case Scala che sono state serializzate usando Lift-Json. Il problema che sto riscontrando è che non so come invocare il metodo generico extractOpt[A] Metodo sotto:

someString:String = {...}
JsonParser.parse(someString).extractOpt[A]

Il tipo di [A] dipenderà dai metadati, ad esempio il nome di classe di [A] Ma per la mia vita non riesco a capire come effettuare la chiamata usando la riflessione. In C# sarei solo in grado di impostare il tipo generico per una chiamata extractOpt[A] usando la riflessione. Temo che i miei problemi siano a che fare con la cancellazione del tipo Java.

Avrò molte classi di casi, quindi voglio davvero evitare di dover creare una sorta di mappa realizzata a mano da {Metadata} -> Classif []. Ho il pieno controllo su ciò a cui si associano i metadati someString è.

Se aiuta a capire perché Ho questo problema, sto implementando l'approvvigionamento di eventi e tutti i miei tipi di [A] saranno eventi persistiti. Qualche idea su cosa posso fare?

È stato utile?

Soluzione

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]

E per i punti bonus, perché premere il pulsante "Poni domande" su StackOverflow ti porta immediatamente in grado di pensare a una soluzione al tuo problema? ;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top