gpt4 book ai didi

arrays - 玩框架,从请求中解析json数组

转载 作者:行者123 更新时间:2023-12-02 06:14:25 25 4
gpt4 key购买 nike

如何将 json 对象数组解析为 scala ListArray

现在我有一个解析单个对象的代码:

{"id":1,"name":"example1"}

这是代码:

def exampleAction = Action.async(parse.json) { implicit request =>
for {
id <- (request.body \ "id").asOpt[Int]
name <- (request.body \ "name").asOpt[String]
} yield {
(exampleService.create(Example(id, name)) map { n => Created("Id of Object Added : " + n) }).recoverWith {
case e => Future {
InternalServerError("There was an error at the server")
}
}
}.getOrElse(Future { BadRequest("Wrong json format") })
}

但是我应该如何更改它来解析这样的 json 请求:

{[{"id":1,"name":"example1"},{"id":2,"name":"example2"}]}

我想应该在某处使用函数 map

最佳答案

您的 Controller 不需要担心验证和映射特定的类字段,那是模型的工作。假设您使用的是 Example 案例类,您可以使用 Play 提供的 Json.reads 宏轻松创建 Reads[Example] .隐式Reads应该放在相应类的伴生对象中,这样隐式就可以从任何地方获取。如果需要,您还可以通过阅读 documentation 创建更多自定义 Reads ,但现在我们将坚持基础知识。

import play.api.libs.json._

case class Example(id: Int, name: String)

object Example {
implicit val reads: Reads[Example] = Json.reads[Example]
}

然后,在您的 Controller 中,您可以使用 JsValue#validate[A] 尝试一次反序列化整个模型。这样做会返回一个 JsResult[A],它可以是一个包含反序列化模型的 JsSuccess[A],也可以是一个 JsError .我们可以折叠结果来处理这两种情况。

def exampleAction = Action.async(parse.json) { implicit request =>
request.body.validate[Example].fold(
error => Future.successful(InternalServerError("JSON did not validate.")),
example => {
// Do something with the case class
exampleService.create(example).map {
// ...
} recoverWith {
// ...
}
}
)
}

现在,您可以轻松更改上述 Controller 以处理数组而不是单个模型,方法是:

request.body.validate[List[Example]]

fold 方法的第二部分,您将获得一个可以使用的 List[Example]


请注意,在您的错误情况下,您可以将它们包装在 Future 中,而不是使用 Future { ... } 来包装本质上不阻塞任何内容的常量值。 successful(...) 以避免将琐碎的工作分配给 ExecutionContext

关于arrays - 玩框架,从请求中解析json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42564997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com