使用Play JSON将嵌套的scala对象转换为JSON字符串

时间:2014-06-03 02:59:50

标签: json scala playframework bson

我有一堆用于构建复杂对象Publisher的案例类。

sealed case class Status(status: String)
trait Running extends Status
trait Stopped extends Status


case class History(keywords: List[String], updatedAt: Option[DateTime])
case class Creds(user: String, secret: String)
case class Publisher(id: Option[BSONObjectID], name: String, creds: Creds, status: Status, prefs: List[String], updatedAt: Option[DateTime])

我想使用play JSON API将Publisher转换为JSON字符串。 我使用Json.toJson(publisher)并抱怨implicit没有Publisher。在我提供以下内容后,错误消失了

implicit val pubWrites = Json.writes[Publisher]

由于例外情况,它现在抱怨无法找到Status, BSONObjectID and Creds的含义。但是,当我为每个状态和信用提供隐含时,它仍然会抱怨。

implicit val statusWrites = Json.writes[Status]
implicit val credsWrites = Json.writes[Creds]

知道如何解决这个问题吗?这是我第一次使用Play JSON。之前我曾经使用过Json4s,并希望在我移动Json4s之前使用Play JSON尝试这个,除非使用/不使用Json4s和Play JSON有明显的好处。

1 个答案:

答案 0 :(得分:4)

隐含的顺序也很重要。从最不重要到最重要。如果Publisher的Writes需要写入状态,则状态写入的隐式应该在Publisher的写入之前。

以下是我测试过的代码

import play.modules.reactivemongo.json.BSONFormats._
import play.api.libs.json._
import reactivemongo.bson._
import org.joda.time.DateTime


sealed case class Status(status: String)
trait Running extends Status
trait Stopped extends Status


case class History(keywords: List[String], updatedAt: Option[DateTime])
case class Creds(user: String, secret: String)
case class Publisher(id: Option[BSONObjectID], name: String, creds: Creds, status: Status, prefs: List[String], updatedAt: Option[DateTime])

implicit val statusWrites = Json.writes[Status]
implicit val credsWrites = Json.writes[Creds]
implicit val pubWrites = Json.writes[Publisher]

val p = Publisher(
Some(new BSONObjectID("123")), 
"foo",
Creds("bar","foo"),
new Status("foo"),
List("1","2"),
Some(new DateTime))

Json.toJson(p)
//res0: play.api.libs.json.JsValue = {"id":{"$oid":"12"},"name":"foo","creds":{"user":"bar","secret":"foo"},"status":{"status":"foo"},"prefs":["1","2"],"updatedAt":1401787836305}