Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert case class to JSON in Play framework 2.3.x (Scala)?

Anyone can show me how to convert case class class instances to JSON in Play framework (particularly Play v2.3.x) with Scala?

For example I have code like this:

case class Foo(name: String, address: String)

def index = Action {
      request => {
        val foo = Foo("John Derp", "Jem Street 21")  // I want to convert this object to JSON
        Ok(Json.toJson(foo))    // I got error at here
      }
}

The error message:

Cannot write an instance of com.fasterxml.jackson.data bind.JsonNode to HTTP response. Try to define a Writeable[com.fasterxml.jackson.databind.JsonNode]

UPDATE: I found out the above error is caused by wrong import of the Json class, it should be: import play.api.libs.json.Json. However I still got error on implicit problem below.

I have read this tutorial, but when I tried the implicit Writes[Foo] code:

  implicit val fooWrites: Writes[Foo] = (
        (JsPath \ "name").write[String] and
            (JsPath \ "address").write[String]
        )(unlift(Foo.unapply))

I got Can't resolve symbol and and Can't resolve symbol unlift error in Intellij. Also the tutorial's code looks complex just for the conversion of an object to JSON. I wonder if there is more simple way to do this?

like image 383
null Avatar asked Jan 07 '15 11:01

null


2 Answers

You can get an Writes[Foo] instance by using Json.writes:

implicit val fooWrites = Json.writes[Foo]

Having this implicit in scope is all you need to convert Foo to JSON. See the documetnation here and here for more info about JSON reads/writes.

like image 81
edi Avatar answered Oct 21 '22 20:10

edi


The second problem - Can't resolve symbol and - is an Intellij bug introduced in version 1.3 of the Scala plugin. In version 1.3.3 of the Scala plugin, there's now a workaround - set preference checkbox:

Languages & Frameworks > Scala > Core (default) tab > Use old implicit search algorithm

like image 42
Ed Staub Avatar answered Oct 21 '22 20:10

Ed Staub