在地图中使用枚举枚举不起作用

时间:2018-09-19 12:50:53

标签: scala play-json enumeratum

我使用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 个答案:

答案 0 :(得分:1)

仅当您的func encode() -> [String: Any] { return ["id": id, "data": data] } 键是Format时,才会隐式提供Map的Play Map转换器,因为JSON对象键必须是字符串。它没有意识到String最终 Language(或更确切地说是String)。因此,您需要为JsString手动编写自己的ReadsWrites转换器,或者将Map[Language, String]映射到Language键,例如您拥有{ {1}},如上所述。就其价值而言,第一个解决方案大致采用以下结构:

String