Scala,PlayFramework - 没有可用于 Any 的隐式格式
Scala, PlayFramework - No implicit Format available for Any
我有一个案例 class 和隐式格式如下:
case class Foo(x:String, y:Any)
implicit val fooFormat = Json.format[Foo]
我想将 class Foo 转换为 Json,但是,我收到错误 No implicit format Any available。
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 提供隐式格式?
显式提供写入并处理 Any
可以是 Int、Long、Float、Double、String、Boolean 等的情况
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}
我有一个案例 class 和隐式格式如下:
case class Foo(x:String, y:Any)
implicit val fooFormat = Json.format[Foo]
我想将 class Foo 转换为 Json,但是,我收到错误 No implicit format Any available。
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 提供隐式格式?
显式提供写入并处理 Any
可以是 Int、Long、Float、Double、String、Boolean 等的情况
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}