短い回答: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)
}
}
私は、私は次のエラー暗黙のヴァルmyEnumReadsを取得REPLであなたのコードを試してください:見つかりません::タイプEnumA 暗黙のヴァル・myEnumReads:[EnumA#値] = EnumUtils.enumReads(EnumA) エラーを読み込み、[EnumAを読み込み#Value] = EnumUtils.enumReads(EnumA) ^ – smk
@smk:OPsのコンテキストは、私が投稿したコードに暗黙のうちに書かれていました。私はそれを今更新するように更新しました。ここに完全なものがあります(要点として)(https://gist.github.com/mikesname/5237809) – Mikesname
ありがとうございました。 – smk