如何为映射[Int,Long]编写Json读取组合器
我正在尝试为类型Map[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的帮助。这应该可以,但需要
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解析的,但这次我无法描绘出地图。