2014-05-22 12 views
16

Biorąc pod uwagę następujące wyliczenie ...play Framework: Jak do serializacji/deserializacji wyliczenie do/od 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) 
    } 
} 

... Muszę serializacji/deserializacji go do/od JSON. myEnumFormat nie kompiluje i zawsze pojawia się następujący komunikat o błędzie:

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) 

jestem brakuje czegoś?

Odpowiedz

13

Spróbuj zmienić ją

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

Włożyłem razem bardziej rodzajowe i wielokrotnego użytku EnumerationReads, EnumerationWrites i klasy EnumerationFormat i napisali je na mojej stronie github:

EnumerationCombinators.scala

17

implicit val genderReads = Reads.enumNameReads(Gender) działa dobrze dla mnie. Graj Scala 2.4.2

+0

To jest dobra odpowiedź - ja nie znam tych istniał – MrProper

0

Rozwijając na odpowiedź @ surenyonjan za następujące prace ładnie z luzem 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 
}