Instancier un type basé sur json et des métadonnées à l'aide de lift-json
-
28-10-2019 - |
Question
Je voudrais désérialiser les classes de cas Scala qui ont été sérialisées à l'aide de lift-json. Le problème que j'ai est, je ne sais pas comment invoquer la méthode générique extractOpt[A]
méthode ci-dessous:
someString:String = {...}
JsonParser.parse(someString).extractOpt[A]
Le type de [A]
va dépendre des métadonnées, par exemple le nom de classe de [A]
mais pour la vie de moi je ne peux pas trouver comment faire l'appel en utilisant la réflexion. En c #, je serais juste capable de définir le type générique pour un appel sur extractOpt[A]
en utilisant la réflexion. J'ai peur que mes problèmes soient liés à l'effacement de type Java.
Je vais avoir beaucoup de classes de cas, donc je veux vraiment éviter d'avoir à créer une sorte de carte faite à la main à partir de {metadata} -> classOf []. J'ai un contrôle total sur les métadonnées associées à someString
.
Si cela permet de comprendre pourquoi je rencontre ce problème, j'implémente le sourçage d'événements et tous mes types [A] seront des événements persistants. Des idées sur ce que je peux faire?
La solution
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]
Et pour les points bonus, pourquoi le fait d'appuyer sur le bouton «poser une question» sur StackOverflow vous permet-il de trouver instantanément une solution à votre propre problème?;)