如何在 Play 框架 2.3.x (Scala) 中将大小写 class 转换为 JSON?

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

任何人都可以告诉我如何使用 Scala 在 Play 框架(特别是 Play v2.3.x)中将 case class class 实例转换为 JSON?

例如我有这样的代码:

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
      }
}

错误信息:

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

更新: 我发现上面的错误是由 Json class 错误导入引起的,它应该是:import play.api.libs.json.Json .但是我仍然在下面的隐式问题上出错。

我已阅读 this tutorial,但是当我尝试隐式 Writes[Foo] 代码时:

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

我在 Intellij 中遇到 Can't resolve symbol andCan't resolve symbol unlift 错误。此外,本教程的代码看起来很复杂,只是为了将对象转换为 JSON。请问有没有更简单的方法呢?

您可以使用 Json.writes:

获得一个 Writes[Foo] 实例
implicit val fooWrites = Json.writes[Foo]

将此隐含在范围内是将 Foo 转换为 JSON 所需的全部内容。有关 JSON reads/writes.

的更多信息,请参阅文档 here and here

第二个问题 - Can't resolve symbol and - 是 Scala 插件 1.3 版中引入的 Intellij bug。在 Scala 插件的 1.3.3 版本中,现在有一个解决方法 - 设置首选项复选框:

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