当前位置: 首页 > 面试题库 >

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

穆建元
2023-03-14
问题内容

Play Framework 2.1中的新ScalaJson功能让我有些迷惑。我想在枚举中写读和写。

这是我的代码:

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
    }
}}

任何想法 ?

谢谢。


问题答案:

简短答案:使用类似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.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中使用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.enumWrites
val 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)
  }
}


 类似资料:
  • 问题内容: 我有一个有趣的json数据,看起来像: 我写了案例类和自定义内容: 当我使用以下方法验证提供的数据时: 我得到: 我可以像这样使用JsPath访问它 但是我真的不知所措,我在自定义读取方面做错了什么。我已经尝试过放置另一个顶级键和其他组合,但是似乎我缺少了一些关键的东西,因为我是从今天开始的。 非常感谢。 问题答案: 错误告诉您不是数组而是数组。因此,似乎您应该阅读JSON 而不是 假

  • 我正在尝试使用PlayJava模板创建小型CRUD应用程序。我通过cmd使用typesafeactivator创建了一个新项目,所以现在我想启用ebean并更改mysql数据库。im使用激活器1.3。6,对于使用我的phpmyadmin sql 5.6的sql im。20我在谷歌上搜索了一下,我做了所有的事情,比如纪录片,但我仍然无法解决我的问题我无法添加ebean我的项目,我无法连接mysql连

  • 问题内容: 在文件中,在Play创建的默认项目中!,有这行: 我了解,如果需要添加更多样式,则必须在视图脚本中使用 应该在哪里,但是似乎很难将值设置为完整的HTML 标签。如果视图需要添加更多样式或脚本,该怎么办? 谢谢! 问题答案: 您可以通过以下方式设置更多样式: 像脚本:

  • 在 JSON 基础一节中,我们介绍了 Reads 和 Writes 转换器。使用它们,我们可以在 JsValue 结构和其他数据类型之间做转换。这一节将更详细地介绍如何构建这些转换器,以及在转换的过程中如何进行验证。 这一节使用到的 JsValue 结构以及相应的模型: import play.api.libs.json._ val json: JsValue = Json.parse(""" {

  • 问题内容: 我想知道(我的Java应用程序的)播放框架版本与我的应用程序的Java版本之间是否有任何联系? 示例:如果我使用play 2.2.1并在计算机上安装了java8。我可以在代码中使用java8吗? 如果有连接。java8的第一个播放版本是什么? 谢谢你妮芙 问题答案: Play 2.3.x是提及Java 8的第一个版本,请参见此处 今天早晨,我正在与我的一位同事交谈,他发现运行2.1.x

  • 在用400k记录查询MongoDb时,我得到了< code>OutOfMemoryError。我收集了大约40万条用户记录。当我试图检索所有用户(在弹性搜索中转储)时,我得到了< code>OutOfMemoryError错误。 我已经浏览过这个链接,在application.config中添加了jvm.memory=-Xms64m -Xmx1024m,但还是一样的异常。 这是我的堆栈跟踪 -