title: Convert polymorphic case classes to json and back
body: <p>I am trying to use spray-json in scala to recognize the choice between Ec2Provider and OpenstackProvider when converting to Json and back.
  I would like to be able to give choices in "Provider", and if those choices don't fit the ones available then it should not validate.</p>
  
  <p>My attempt at this can be seen in the following code:</p>
  
  <pre><code>import spray.json._
  import DefaultJsonProtocol._ 
  
  case class Credentials(username: String, password: String)
  abstract class Provider
  case class Ec2Provider(endpoint: String,credentials: Credentials) extends Provider
  case class OpenstackProvider(credentials: Credentials) extends Provider
  case class Infrastructure(name: String, provider: Provider, availableInstanceTypes: List[String])
  case class InfrastructuresList(infrastructures: List[Infrastructure])
  
  object Infrastructures extends App with DefaultJsonProtocol {
     implicit val credFormat = jsonFormat2(Credentials)
     implicit val ec2Provider = jsonFormat2(Ec2Provider)
     implicit val novaProvider = jsonFormat1(OpenstackProvider)
     implicit val infraFormat = jsonFormat3(Infrastructure)
     implicit val infrasFormat = jsonFormat1(InfrastructuresList)
  
    println(
      InfrastructuresList(
        List(
          Infrastructure("test", Ec2Provider("nova", Credentials("user","pass")), List("1", "2")) 
        )
      ).toJson
    )
  }
  </code></pre>
  
  <p>Unfortunately, it fails because it can not find a formatter for <code>Provider</code> abstract class.</p>
  
  <pre><code>test.scala:19: could not find implicit value for evidence parameter of type Infrastructures.JF[Provider]
  </code></pre>
  
  <p>Anyone have any solution for this?</p>