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

9

请问有人能向我展示如何在Play框架(特别是Play v2.3.x)中使用Scala将case 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
      }
}

错误信息:

无法将com.fasterxml.jackson.databind.JsonNode的实例写入HTTP响应。尝试定义一个Writeable [com.fasterxml.jackson.databind.JsonNode]

更新:我发现上述错误是由于导入了错误的Json类引起的,正确的应该是:import play.api.libs.json.Json。但是我仍然遇到下面的隐式问题。
我已经阅读了这个教程,但是当我尝试使用隐式的Writes[Foo]代码时:
  implicit val fooWrites: Writes[Foo] = (
        (JsPath \ "name").write[String] and
            (JsPath \ "address").write[String]
        )(unlift(Foo.unapply))

我在Intellij中遇到了无法解析符号和无法解析符号unlift的错误。同时,教程中的代码看起来很复杂,仅仅是将对象转换为JSON。我想知道是否有更简单的方法?

2个回答

8
您可以通过使用Json.writes来获取Writes[Foo]实例:
implicit val fooWrites = Json.writes[Foo]

只需将隐式作用域中的内容转换为 JSON,即可将 Foo 转换为 JSON。有关 JSON 读取/写入的更多信息,请参见此处此处的文档。


你好,非常感谢。你知道在哪里可以找到有关在Play 2.3中使用Json的简单指南或文档吗?此外,您能解释一下我尝试的原始implicit Writes中的错误“无法解析符号和”(以及“unlift”)吗?(请参见更新的问题,我已经将代码放在那里了) - null
1
为了解决符号错误,您需要导入 play.api.libs.functional.syntax._。我提供的文档链接应该可以回答您关于 unlift 的问题,同时还包含有关 Play JSON 的足够一般信息。 - edi
1
再次感谢您的帮助。我想知道为什么Intellij无法检测到导入。 - null

1
第二个问题——“无法解析符号和”——是Scala插件版本1.3引入的Intellij bug。在Scala插件的1.3.3版本中,现在有一个解决方法——设置首选项复选框:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接