object ScalaMain {
trait A[T] {
def shared(v: T): Int
}
case class B(shared: Int, other: String)
case class C(shared: Int)
case class D()
import net.liftweb.json._
implicit val formats = DefaultFormats
val dataB = """{"other":"abd"}"""
val dataC = """{"shared":11}"""
implicit object BShared extends A[B]{
override def shared(b:B)= b.shared
}
implicit object CShared extends A[C]{
override def shared(c:C)=c.shared
}
def extractJson[T:Manifest:A](data:String)={
try{
Some(implicitly[A[T]].shared(parse(data).extract[T]))
}catch{
case e:Throwable =>None
}
}
// def main(args: Array[String]): Unit = {
// val result =extractJson[B](dataB) orElse extractJson[B](dataC) orElse extractJson[C](dataB) orElse extractJson[C](dataC)
// println(result)
// }
}