如何为映射[Int,Long]编写Json读取组合器

如何为映射[Int,Long]编写Json读取组合器,json,scala,playframework,playframework-json,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 combinator的帮助。这应该可以,但需要

我正在尝试为类型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 combinator的帮助。

这应该可以,但需要注意的是,在
Reads
案例中,它不处理
NumberFormatException

//
// 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
      })
    }
  }
}
作为单独的
读取
写入
实例:

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

这种格式与我上面所做的有什么不同?你的代码片段可以被写为两个独立的隐式读写吗?@Blankman
Format
就是
,所以如果你喜欢的话,你可以把它一分为二,但是当我需要实现这两个特性时,我倾向于使用
Format
。你能请在你的代码下面为我拆分阅读内容,我只是想看到它被拆分出来学习一些东西。我有点被困在这样做了,谢谢!@Blankman我已经编辑了我的答案。不知道你为什么觉得这很难,这是一个非常机械的过程。也许你还没有掌握一些概念?谢谢。是的,我只是习惯于写阅读唱JsPath\'abc'。我想我不明白
JsPath\'“…”和JsPath以及
然后调用.apply到底在做什么。这很好,这个问题暴露了我的无知:)同样让我困惑的是以前所有的阅读我都能想象出json是用JsPath解析的,但这次我无法描绘出地图。