The general solution would look like this:
def javaEnumFormat[E <: Enum[E] : ClassTag] = new Format[E] { override def reads(json: JsValue): JsResult[E] = json.validate[String] match { case JsSuccess(value, _) => try { val clazz = implicitly[ClassTag[E]].runtimeClass.asInstanceOf[Class[E]] JsSuccess(Enum.valueOf(clazz, value)) } catch { case _: IllegalArgumentException => JsError("enumeration.unknown.value") } case JsError(_) => JsError("enumeration.expected.string") } override def writes(o: E): JsValue = JsString(o.toString) }
which you can use as follows:
implicit val enumNoFieldsFormat = javaEnumFormat[EnumNoFields]
source share