如何为Map编写Json Reads Combinator [Int,Long]

时间:2015-02-23 15:16:22

标签: json scala playframework playframework-json

我正在尝试为类型Map [Int,Long]

编写一个json读取组合器

到目前为止,我有这个:

implicit val mapWrites = Json.writes[Map[Int, Long]]

implicit val mapReads: Reads[Map[Int, Long]] = (
  // ???
) // ?

我不确定这是如何工作的,我尝试做(Map [Int,Long] .apply但是apply方法不可用。

寻找一些帮助来编写这个Reads组合器。

1 个答案:

答案 0 :(得分:8)

这应该这样做,但需要注意的是它在NumberFormatException案例中没有处理reads

//
// scala> Json.toJson(Map(1 -> 2L, 2 -> 3L))
// res0: play.api.libs.json.JsValue = {"1":2,"2":3}
//
implicit val formatter: Format[Map[Int, Long]] = {
  new Format[Map[Int, Long]] {
    def writes(m: Map[Int, Long]) = {
      Json.toJson(m.map {
        case (key, value) => key.toString -> value
      })
    }

    def reads(json: JsValue) = {
      json.validate[Map[String, Long]].map(_.map {
        case (key, value) => key.toInt -> value
      })
    }
  }
}

作为单独的ReadsWrites个实例:

implicit val readsInstance: Reads[Map[Int, Long]] = {
  new Reads[Map[Int, Long]] {
    def reads(json: JsValue) = {
      json.validate[Map[String, Long]].map(_.map {
        case (key, value) => key.toInt -> value
      })
    }
  }
}

implicit val writesInstance: Writes[Map[Int, Long]] = {
    def writes(m: Map[Int, Long]) = {
      Json.toJson(m.map {
        case (key, value) => key.toString -> value
      })
    }
  }
}