Использование Enumeratum Enum в карте не работает

У меня есть Enumeration, созданный с помощью enumeratum:

sealed trait Language extends EnumEntry

object Language
  extends Enum[Language]
    with PlayInsensitiveJsonEnum[Language] {

  val values: IndexedSeq[Language] = findValues

  case object DE extends Language
  ...
}

Если я использую его на карте, он выдает:

No instance of play.api.libs.json.Format is available for scala.collection.immutable.Map[finnova.bpf.api.entity.Language, java.lang.String] in the implicit scope (Hint: if declared in the same file, make sure it's declared before)

Вот определение:

case class I18nEntry(values: Map[Language, String])

object I18nEntry {
  implicit val jsonFormat: Format[I18nEntry] = Json.format[I18nEntry]
}

Это здесь работает:

case class I18nEntry(values: Map[String, String], language: Language)

1 ответ

Решение

Игра Format конвертер для Map будет неявно предоставлено, только если ваш Map ключ является String, поскольку ключи объекта JSON должны быть строками. Это не понимает, что Language в конечном итоге String (или, скорее, JsString). Поэтому вам нужно будет написать свой собственный вручную Reads а также Writes преобразователи для Map[Language, String]или альтернативно карта Language к String ключ такой как у вас values: Map[String, String] как вы сделали выше. Для чего бы это ни стоило, первое решение было бы примерно такой структуры:

val langMapReads: Reads[Map[Language, String]] = ???
val langMapWrites: Writes[Map[Language, String]] = ???
implicit val langMapFormat: Format[Map[Language, String]] = Format(langMapReads, langMapWrites)
Другие вопросы по тегам