2013-03-18 6 views
24

Play Framework 2.1で新しいScalaJson機能が少し失われています。 私はEnumerationにReadsとWritesを書きたいと思います。ここで書き込み方法[T]と書き込み[T] in scala列挙(play framework 2.1)

は私のコードです:

object EnumA extends Enumeration { 
type EnumA = Value 
val VAL1, VAL2, VAL3 = Value 

def parse(str:String) : EnumA = { 
    str.toUpperCase() match { 
     case "VAL1" => VAL1 
     case "VAL2" => VAL2 
     case "VAL3" => VAL3 
     case _ => null 
    } 
}} 

任意のアイデア?

ありがとうございました。

答えて

41

短い回答:Play Enumeration Utilsのようなものを使用してください。 、代わりに置くの

ロング答えはあなたの列挙型に、あなたは再使用可能なが列挙型のための読み込み作成することができます読み込み:あなたが列挙型に何かを解析する際に続いて

object EnumA extends Enumeration { 
    type EnumA = Value 
    val VAL1, VAL2, VAL3 = Value 
} 

object EnumUtils { 
    def enumReads[E <: Enumeration](enum: E): Reads[E#Value] = new Reads[E#Value] { 
    def reads(json: JsValue): JsResult[E#Value] = json match { 
     case JsString(s) => { 
     try { 
      JsSuccess(enum.withName(s)) 
     } catch { 
      case _: NoSuchElementException => JsError(s"Enumeration expected of type: '${enum.getClass}', but it does not appear to contain the value: '$s'") 
     } 
     } 
     case _ => JsError("String value expected") 
    } 
    } 
} 

、作成暗黙のスコープで特定の列挙型のための読み込み:

import some.thing.EnumUtils 
implicit val myEnumReads: Reads[EnumA.Value] = EnumUtils.enumReads(EnumA) 

val myValue: EnumA.Value = someJsonObject.as[EnumA.Value] 

または

val myValue: EnumA.Value = someJsonObject.asOpt[EnumA.Value].getOrElse(sys.error("Oh noes! Invalid value!")) 

(Scalaでヌルを使用することが悪いフォームと見なされます。)

JsValuesとして列挙型を書くことは簡単です:

object EnumUtils { 
    ... 
    implicit def enumWrites[E <: Enumeration]: Writes[E#Value] = new Writes[E#Value] { 
    def writes(v: E#Value): JsValue = JsString(v.toString) 
    } 
} 

は、それからちょうどスコープにあなたが列挙型を書く(または明示的にそれを渡そうとする前にいることをインポートしますtoJson関数に:

012:

import EnumUtils.enumWrites 
val myEnumJson: JsValue = Json.toJson(EnumA.VAL1) 

あなたは同様に読み取りと書き込みの両方を組み合わせた書式オブジェクトを作成するための関数を作ることができます

object EnumUtils { 
    .... 
    implicit def enumFormat[E <: Enumeration](enum: E): Format[E#Value] = { 
    Format(EnumReader.enumReads(enum), EnumWriter.enumWrites) 
    } 
} 
+0

私は、私は次のエラー暗黙のヴァルmyEnumReadsを取得REPLであなたのコードを試してください:見つかりません::タイプEnumA 暗黙のヴァル・myEnumReads:[EnumA#値] = EnumUtils.enumReads(EnumA) エラーを読み込み、[EnumAを読み込み#Value] = EnumUtils.enumReads(EnumA) ^ – smk

+1

@smk:OPsのコンテキストは、私が投稿したコードに暗黙のうちに書かれていました。私はそれを今更新するように更新しました。ここに完全なものがあります(要点として)(https://gist.github.com/mikesname/5237809) – Mikesname

+0

ありがとうございました。 – smk

関連する問題