0

我有一个这样定义的案例类:

scala> import play.api.libs.json._
  import play.api.libs.json._
scala> import play.api.libs.functional.syntax._
  import play.api.libs.functional.syntax._

scala> type MapIntString = Map[Int, String]
  defined type alias MapIntString

case class Duh(a: MapIntString)
  defined class Duh

当我尝试以这种方式声明其 Writes 时,出现错误:

scala> implicit val duhWrites = Json.writes[Duh]
  <console>:25: error: No implicit Writes for MapIntString available.
  implicit val duhWrites = Json.writes[Duh]

所以我求助于这个......,仍然有一个错误:

scala> implicit val duhWrites: Writes[Duh] = (
     |   (JsPath \ "a").write[MapIntString]
     | )(unlift(Duh.unapply _))
  <console>:26: error: overloaded method value write with alternatives:
  (t: MapIntString)(implicit w: play.api.libs.json.Writes[MapIntString])play.api.libs.json.OWrites[play.api.libs.json.JsValue] <and>
  (implicit w: play.api.libs.json.Writes[MapIntString])play.api.libs.json.OWrites[MapIntString]
  cannot be applied to (Duh => MapIntString)
  (JsPath \ "a").write[MapIntString]

有人可以帮我指出我做错了什么吗?

我觉得我对这个读/写组合器的理解有点不稳定。我在这里发布了相关问题(当我试图了解发生了什么时):ScalaJsonCombinator 中的这个“和”是什么(定义写入时)?

如果您知道为“Duh”实现写入和读取的最佳方式,请分享。

提前致谢!

4

1 回答 1

2

没有预定义WritesMap[Int, String],只有Map[String, A]。这是因为所有 JSON 键都必须是 a String, toInt键并没有任何意义。您可以通过定义将Int键转换为Strings 的方法来解决此问题。

type MapIntString = Map[Int, String]

implicit val mapIntWrites = new Writes[MapIntString] {
    def writes(m: MapIntString): JsValue = 
        Json.toJson(m.map { case (k, v) => (k.toString, v)} )
}

scala> implicit val duhWrites = Json.writes[Duh]
duhWrites: play.api.libs.json.OWrites[Duh] = play.api.libs.json.OWrites$$anon$2@50973f47
于 2015-02-04T20:23:37.297 回答