Ra Ka
Ra Ka

Reputation: 3055

Scala, PlayFramework - No implicit Format available for Any

I have a case class and implicit format as below:

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

and I want to convert class Foo to Json, However, I am getting error 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]

So, how can I provide implicit format for type Any?

Upvotes: 1

Views: 561

Answers (1)

Nagarjuna Pamu
Nagarjuna Pamu

Reputation: 14825

Provide writes explicitly and handle the cases in which Any can be 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}

Upvotes: 3

Related Questions