Installa un tipo basato su JSON e metadati usando Lift-JSON
-
28-10-2019 - |
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?
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? ;)