2017-04-19 1 views
0

J'ai une classe de cas et le format implicite comme ci-dessous:Scala, play framework - Non Format implicite disponible pour tous les

case class Foo(x:String, y:Any) 
implicit val fooFormat = Json.format[Foo] 

et je veux convertir Foo classe en JSON, mais je reçois erreur Aucune implicite format Tout disponible. Donc, comment puis-je fournir un format implicite pour le type Any?

+4

Comment voulez-vous qu'il être sérialisé? Puisque 'Any' pourrait être (littéralement) n'importe quoi, il peut avoir une sérialisation possible très différente. BTW, si vous voulez seulement la sérialisation, vous devriez utiliser 'Json.writes [Foo]'. –

Répondre

2

Fournir écrit explicitement et traiter les cas où Any peut être Int, Long, Float, Double, String, Boolean etc

case class Foo(x:String, y:Any) 

implicit val writes = new Writes[Foo] { 
    override def writes(o: Foo): JsValue = { 
    Json.obj("x" -> o.x) ++ { 
     o.y match { 
     case a: Int => Json.obj("y" -> a) 
     case a: Long => Json.obj("y" -> a) 
     case a: Float => Json.obj("y" -> a) 
     case a: Double => Json.obj("y" -> a) 
     case a: String => Json.obj("y" -> a) 
     case a: Boolean => Json.obj("y" -> a) 
     case a => Json.obj("y" -> a.toString) 
     } 
    } 
    } 
} 

Scala REPL

scala> Json.toJson(Foo("foo", true)) 
res5: play.api.libs.json.JsValue = {"x":"foo","y":true} 

scala> Json.toJson(Foo("foo", 1.toFloat)) 
res6: play.api.libs.json.JsValue = {"x":"foo","y":1} 

scala> Json.toJson(Foo("foo", (1.131313).toFloat)) 
res7: play.api.libs.json.JsValue = {"x":"foo","y":1.1313129663467407} 

scala> Json.toJson(Foo("foo", (1.131313).toDouble)) 
res8: play.api.libs.json.JsValue = {"x":"foo","y":1.131313}