栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Scala枚举中编写Reads [T]和Writes [T](播放框架2.1)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Scala枚举中编写Reads [T]和Writes [T](播放框架2.1)

简短答案:使用类似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")    }  }}

然后,当您想将某些内容解析为枚举时,请为作用域中的特定Enum类型创建一个隐式的Reads:

import some.thing.EnumUtilsimplicit 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中使用null被认为是错误的形式。)

用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
函数之前),将其导入作用域:

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

您可以类似地使函数创建一个结合读取和写入的Format对象:

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437172.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号