如何遍历已发布的 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(_)
}
以下 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(_)
}