2014-02-12 10 views
6

Wie kann ich mit der JSON-Bibliothek von Play Framework Reads und Writes für eine Java-Enumeration ohne Felder erstellen?Erstellen von Lese-/Schreibvorgängen für Java Enum ohne Feld

public enum EnumNoFields { RED, WHITE, BLUE }

implicit val EnumNoFieldsReads: Reads[EnumNoFields] = ? 
implicit val EnumNoFieldsWrites: Writes[EnumNoFields] = ? 
+0

möglich Duplikat [Wie schreibt man Liest \ [T \] und Schreibt \ [T \] in Scala Enumeration (play framework 2.1)] (http://stackoverflow.com/questions/15488639/how-to-write-readst-and- writes-in-scala-enumeration-play-framework -2-1) –

+2

Nein, Diese Frage bezieht sich auf Java-Enums, die in Scala verwendet werden. Die andere bezieht sich auf Scala's eigene Enumeration-Klasse. – AlexG

Antwort

5

ich einfach nutzen Enum#name gemacht.

implicit val EnumNoFieldsReads: Reads[EnumNoFields] = 
    (JsPath \ "displayValue").read[String].map{x: String => EnumNoFields.valueOf(x)} 

    implicit val EnumNoFieldsWrites: Writes[EnumNoFields] = 
    (JsPath \ "displayValue").write[String].contramap{x:EnumNoFields => x.name} 
+0

Wenn ich diese Frage heute beantworten würde, würde ich meinem jüngeren Selbst empfehlen, sich https://github.com/lloydmeta/enumeratum anzuschauen! –

6

Eine generische Lösung würde wie folgt aussehen:

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) 
} 

, die Sie wie folgt verwenden können:

implicit val enumNoFieldsFormat = javaEnumFormat[EnumNoFields]