我正在尝试为类型 Map[Int, Long] 编写一个 json 读取组合器
到目前为止我有这个:
implicit val mapWrites = Json.writes[Map[Int, Long]]
implicit val mapReads: Reads[Map[Int, Long]] = (
// ???
) // ?
我不确定这将如何工作,我尝试过 (Map[Int, Long].apply 但该应用方法不可用。
寻找一些帮助来编写这个读取组合器。
我正在尝试为类型 Map[Int, Long] 编写一个 json 读取组合器
到目前为止我有这个:
implicit val mapWrites = Json.writes[Map[Int, Long]]
implicit val mapReads: Reads[Map[Int, Long]] = (
// ???
) // ?
我不确定这将如何工作,我尝试过 (Map[Int, Long].apply 但该应用方法不可用。
寻找一些帮助来编写这个读取组合器。
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
})
}
}
}
作为单独Reads
的Writes
实例:
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
})
}
}
}