Мы используем Scala 2.11.8
и Play framework 2.5.8
не в состоянии разобрать карту с Enum в Json в Play Scala
данных для работы с может быть столь же простым, как:
object EnumA extends Enumeration {
type EnumA = Value
val ONE, TWO, THREE = Value
}
case class NoWork(data: Map[EnumA.Value, String] = Map.empty)
И что я хочу, чтобы архив должен иметь возможность разбирать класс NoWork
до Json
. Я знаю, что для этого требуется предоставление неявного форматирования для Enumeration
.
Я нашел это решение: https://stackoverflow.com/a/15489179/1549135 и применил его.
Объект компаньон предоставления этих implicits выглядит следующим образом:
object NoWork {
implicit val enumAFormat = EnumUtils.enumFormat(EnumA)
implicit val jsonModelFormat = Json.format[NoWork]
}
И это всегда терпит неудачу с ошибкой:
error: No implicit format for Map[EnumA.Value,String] available.
implicit val jsonModelFormat = Json.format[NoWork]
^
В чем проблема?
Я проверил и изменил тип data
на Map[String, String]
, что позволяет выполнять сериализацию. Enum
сам по себе является сериализуемым, так что теперь - как исправить Map
с Enum
типа?
Спасибо!
Редактировать
В ответ Pamu в
implicit val writes = new Writes[Map[EnumA.Value, String]] {
override def writes(o: Map[EnumA.Value, String]): JsValue = Json.toJson(o.map { case (a, b) => Json.parse(s"""{${Json.toJson(a)}:${Json.toJson(b)}}""")}.toList)
}
будет четко работать на эту ситуацию, я бы на самом деле нужно общее решение для других Map[Enum, T]
, что я мог бы использовать во всем приложении.
Но, как я сказал, то 'Enum' работает отлично. Но 'Map [Enum, String]' нет. – Atais
@Atais ... отредактировал ответ ... с тем, что вы ожидаете .. Пожалуйста, проверьте. Надеюсь, это поможет – pamu
, но ... у вас есть такая же ошибка, о которой я изначально спросил о – Atais