2017-04-19 10 views
0

のために利用可能な暗黙のフォーマット:スカラ、PlayFramework - 私はケースクラスと以下のように暗黙の形式持っどれ

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

を、私はJSONへのクラスはFooを変換したい、しかし、私は取得していますエラー暗黙のフォーマット

val foo = Foo("apple", 12) 
println(Json.toJson(foo)) 
[error] Test.scala:33: No implicit format for Any available. 
[error]  implicit val fooFormat = Json.format[Foo] 

したがってAny型の暗黙的な書式はどのようにして提供できますか?

+4

することが可能な場合を扱いますシリアル化するには? 'Any'は(文字通り)何かになる可能性があるので、非常に異なる可能な直列化を持つかもしれません。ところで、シリアライゼーションだけをしたいのであれば、 'Json.writes [Foo]'を使うべきです。 –

答えて

2

提供は、明示的に書き込み、Anyがint、ロング、フロート、ダブル、文字列、論理値など

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}