Как написать коммандер Json Reads для карты [Int, Long]

108
11

Я пытаюсь написать комбинатор для чтения json для типа Map [Int, Long]


У меня это до сих пор:


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

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


Я не уверен, как это будет работать, я пробовал делать (Map [Int, Long].apply, но этот метод применения недоступен.


Ищем некоторую помощь для написания этого комбайнера Reads.

спросил(а) 2021-01-25T20:57:56+03:00 4 месяца, 4 недели назад
1
Решение
132

Это должно сделать это с предупреждением о том, что он не обрабатывает 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
})
}
}
}

ответил(а) 2021-01-25T20:57:56+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема