Анд*_*пов 2 arrays json scala playframework
我怎样才能将一个json对象数组解析为scala List或Array?
现在我有一个解析单个对象的代码:
{"id":1,"name":"example1"}
Run Code Online (Sandbox Code Playgroud)
这是代码:
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") })
}
Run Code Online (Sandbox Code Playgroud)
但是我应该如何更改它以解析像这样的json请求:
{[{"id":1,"name":"example1"},{"id":2,"name":"example2"}]}
Run Code Online (Sandbox Code Playgroud)
我想功能map应该在某个地方使用.
您的控制器不需要担心验证和映射特定的类字段,这是模型的工作.假设Example您似乎正在使用的案例类,您可以Reads[Example]使用Json.readsPlay提供的宏轻松创建.隐式Reads应该放在相应类的伴随对象中,因此隐式可以从任何地方获取.Reads如果需要,您还可以通过阅读文档来创建更多自定义,但是现在我们将坚持基础知识.
import play.api.libs.json._
case class Example(id: Int, name: String)
object Example {
implicit val reads: Reads[Example] = Json.reads[Example]
}
Run Code Online (Sandbox Code Playgroud)
然后,在控制器中,您可以JsValue#validate[A]尝试一次尝试反序列化整个模型.这样做会返回a JsResult[A],它可以是JsSuccess[A]包含反序列化模型的,也可以是a JsError.我们可以fold结果处理这两种情况.
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 {
// ...
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过更改以下内容轻松更改上述控制器以处理数组而不是单个模型:
request.body.validate[List[Example]]
Run Code Online (Sandbox Code Playgroud)
在fold方法的第二部分,您将得到一个List[Example]可以使用的方法.
请注意,在您的错误情况下,Future { ... }您可以改为将它们包装起来,Future.successful(...)以避免将简单的工作分配给ExecutionContext.
| 归档时间: |
|
| 查看次数: |
2547 次 |
| 最近记录: |