如何遍历已发布的 json 数组

How do I loop through posted json array

以下 JSON 数组已发布到我的 Scala 应用程序中:

[
  {
    "Id": 501,
    "Name": "effectiveDate",
    "Value": "14:15:33 GMT"
  },
  {
    "Id": 829,
    "Name": "effectiveData",
    "Value": "15:10:44 GMT",    

  }
]

使用以下方法,我可以访问发布的数据:

val req = if (request.body != null) request.body else null 
   println(req)

但是,我需要遍历它并处理每个对象。

我试过 req.foreach {whatever} 但 Scala Playframework 不喜欢它。

那么,我该怎么做呢? 我在想我需要像 pythons 这样的东西

for item in array:
    print(item)

或 PHP

foreach ($array as $item) {
    echo $item
}

更新: 我添加了 println(ClassTag(req.getClass)) 到文件。响应是:play.api.libs.json.JsArray

我查了一下,import play.api.libs.json.JsArray肯定在文件的开头

使用Json库:

import play.api.libs.json._

val req = if (request.body != null) request.body else null 
val jsonReq: JsValue = Json.parse(req)

您可以执行以下操作

request.body.validate[RefData] //create a case class RefData

或者先转为字符串

val req = if (request.body != null) request.body.toString() else null 
val jsonReq: JsValue = Json.parse(req)

如果您不想使用 case class 映射 JSON,您可以使用以下语句遍历数组:

Option(request.body).fold[JsValue](JsNull)(Json.parse) match {
  case arr: JsArray => arr.value.foreach(elem => println(s"Element: $elem"))
  case _ => println(s"unexpected JSON: ${request.body}")
}

在 Option 中包装 request.body 处理 null 检查你并为匹配语句设置你。

通过使用 body-parser,您可以使用 asJson.map 将正文作为选项处理,使用 validate.map 将其转换为数组,然后对其进行迭代。

import play.api.mvc._
import play.api.libs.json.JsValue

Action { request: Request[AnyContent] =>
  request.body.asJson.map {
    _.validate[Array[JsValue]].map {
      _.foreach(println)
    }
  }
}

我在答案中看到很多 hack 和 slash 选项,但其中 none 是个好主意。看看Body Parsers and Json API.

这是我将如何完成这项工作

  import play.api.libs.json._

  case class VO(Id: Long, Name: String, Value: String)

  implicit val format = Json.format[VO]

  def hello = Action(parse.json[List[VO]]) { req =>
    val listVO: List[VO] = req.body
    ???
  }

通过使用播放体解析器,您可以告诉框架期望的请求体类型是什么。然后您将免费获得验证。如果有任何类型的错误(例如 属性 丢失或类型错误),框架将 return BAD REQUEST 向客户端发送描述问题的消息。

直接使用 JsObject 不是一个好主意。这个低级API不是很方便。最值得注意的是,您将不得不处理大量错误情况并使用字符串来访问属性,从而降低类型安全性。

我已经解决了。 我把它放在 class 声明中

  object Message {
    implicit val jsonFormat: Format[Message] = Json.format[Message]
  }

然后处理程序中的这个

val req = if (request.body != null) request.body else null 
    val messages = (req).as[Seq[Message]]

    messages.foreach{
      // do what you want
      println(_)
    }