json - 如何在 Play Framework REST API 中将 json 转换为实体

标签 json scala rest playframework-2.0 deserialization

我刚刚开始使用 scala 和 play 框架,并坚持这个看似简单的问题。

我有一个 REST 端点,我将向其发布一些 Json 对象。该 Json 对象需要转换为实体。

实体被声明为类型案例类,接收到的Json可以是任何类型的案例类。

我的问题是,我无法将 Json 转换为相应的实体类型,因为(根据教程)我需要在定义的每个字段的验证中编写 implicit Reads

例如

implicit val emailReads: Reads[Email] = (
    (JsPath \ "from").read[String] and
      (JsPath \ "subject").read[String]
    )(Email.apply _)

适用于示例案例类电子邮件。但是当我有这样的案例类时:

abstract class Event
case class OneEventType(type : String) extends Event
case class TwoEventType(type : String, attribute : SomeType) extends Event

并且 Controller 方法基于事件工作:

def events = Action(BodyParsers.parse.json) { request =>
    val eventReceived = request.body.validate[Event]
    //do something
    Ok(Json.obj("status" ->"OK"))
}

我将如何验证事件并构建正确的事件对象,因为在 Reads 方法中我需要指定每个字段?

最佳答案

这应该可以,

implicit val st: Reads[Event] = new Reads[Event] {
  def reads(json: JsValue): JsResult[Event] = {
    json match {
      case JsObject(Seq(("type", JsString(type)), ("attribute", JsString(attribute)))) =>  JsSuccess(TwoEventType(type, attribute))
      case o: JsObject if (o.value.get("type").isDefined) => JsSuccess(OneEventType(o.value.get("type")))
      case a: Any => JsError(a.toString())
    }
  }
}

关于json - 如何在 Play Framework REST API 中将 json 转换为实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674690/

相关文章:

scala - 将 DStream 与动态数据集连接

java - 如何优化 Spark RDD 上的 groupBy() 操作

mongodb - Sinatra + MongoDB 导致 unRESTful API?

javascript - 将 Homebrew 软件依赖项添加到 npm 包

javascript - React-Redux-Firebase 文档中不寻常的 json 语法。有效吗?

json - 带有自动完成问题的 jQueryUI Ajax 调用 - JSON 正确吗?从旧的自动完成迁移

c# - 为什么我的文件没有被我的 Web API 函数的 GET 请求返回?

json - ansible json-query 路径以按内容选择项目

java - 从 Scala 连接到 SQL Server 数据库时出现问题

c# - 是否存在完全空的网站项目这样的事情?