Pergunta

I would like to deserialise Scala case classes that have been serialised using lift-json. The problem I am having is, I don't know how to invoke the generic method extractOpt[A] method below:

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

The type of [A] is going to depend on metadata, for example the class name of [A] but for the life of me I can't work out how to make the call using reflection. In c# I would just be able to set the generic type for a call on extractOpt[A] using reflection. I fear my problems are something to do with Java type erasure.

I am going to have a lot of case classes so I really want to avoid having to create some kind of hand crafted map from {metadata} -> classOf[]. I have full control over what the metadata associated with someString is.

If it helps understand why I have this issue, I am implementing event sourcing, and all my [A] types are going to be persisted events. Any ideas what I can do?

Foi útil?

Solução

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]

And for bonus points, why does pressing the 'ask question' button on StackOverflow lead to you instantly being able to think of a solution to your own problem? ;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top