2014-05-22 11 views
16

Angesichts der folgenden Aufzählung ...Play-Framework: Wie serialisieren/deserialisieren eine Aufzählung zu/von JSON

object MyEnum extends Enumeration { 

    type MyEnum = Value 

    val Val1 = Value("val1") 
    val Val2 = Value("val2") 
    val ValN = Value("valN") 

    implicit val myEnumFormat = new Format[MyEnum] { 
    def reads(json: JsValue) = MyEnum.withName(json.as[String].value) // doesn't compile 
    def writes(myEnum: MyEnum) = JsString(myEnum.toString) 
    } 
} 

... Ich brauche es zu serialisiert/deserialisiert zu/von JSON. myEnumFormat nicht kompilieren und ich bekomme immer folgende Fehlermeldung:

type mismatch; 
[error] found : models.MyEnum.Value 
[error] required: play.api.libs.json.JsResult[models.MyEnumValue] 
[error] Note: implicit value myEnumFormat is not applicable here because it comes after the application point and it lacks an explicit result type 
[error]  def reads(json: JsValue) = MyEnum.withName(json.as[JsString].value) 

Bin ich etwas fehlt?

Antwort

13

Versuchen Sie es zu

Ändern
def reads(json: JsValue) = JsSuccess(MyEnum.withName(json.as[String].value)) 
2

ich haben zusammen mehr Generika und wiederverwendbaren EnumerationReads, EnumerationWrites und EnumerationFormat Klassen und haben sie auf meinem GitHub Seite gepostet:

EnumerationCombinators.scala

17

implicit val genderReads = Reads.enumNameReads(Gender) funktioniert gut für mich. Spielen Scala 2.4.2

+0

Dies ist eine gute Antwort - ich wusste nicht, diese bestanden – MrProper

0

Erweiterung auf @ surenyonjan Antwort, die folgenden Arbeiten gut mit Play Json 2.6:

object MyEnum extends Enumeration { 
    type MyEnum = Value 
    val e1, e2 = Value 

    implicit val myEnumReads = Reads.enumNameReads(MyEnum) 
    implicit val myEnumWrites = Writes.enumNameWrites 
} 
Verwandte Themen