json - 在 Play Framework JsObject 中解析 Json 数组

我有以下 Json:

{
  "web-category" : "macaroons",
  "sub-categories" : [
     { "name" : "pink" },
     { "name" : "blue" },
     { "name" : "green" }
  ]

}

我已经将它作为 JsObject 在 Play 中使用。所以我现在可以成功地做到以下几点:

//(o is the JsObject)

val webCat:Option[String] = (o \ "web-category").asOpt[String]

println(webCat.toString)

>> Some(macaroons)

到目前为止,一切都很好。但是如何访问数组 Json 对象呢?我有这个...

val subCats:Option[JsArray] = (o \ "sub-categories").asOpt[JsArray]

println(subCats.toString)

>> Some([{"name" : "blue"},{"name" : "green"},{"name" : "pink"}])

但我需要的是获取 JsArray 并获取所有名称的列表,如下所示:

List("blue", "green", "pink")

不知道如何访问 JsArray。

感谢您在这方面的帮助。

最佳答案

我认为尽早从 JSON-land 迁移到 native-Scala-representation-land 通常是个好主意。例如,如果 obj 是你的 JsObject,你可以这样写:

val subCategories = (obj \ "sub-categories").as[List[Map[String, String]]]

val names = subCategories.map(_("name"))

甚至:

case class Category(name: String, subs: List[String])

import play.api.libs.functional.syntax._

implicit val categoryReader = (
  (__ \ "web-category").read[String] and
  (__ \ "sub-categories").read[List[Map[String, String]]].map(_.map(_("name")))
)(Category)

然后:

obj.as[Category]

后一种方法使错误处理更加清晰(例如,您可以在此顶层将 as 替换为 asOpt)并与其他 Reads 很好地组合code> 类型类实例——例如,如果你有这些对象的 JsArray,你可以只写 array.as[List[Category]] 并得到你所期望的.

关于json - 在 Play Framework JsObject 中解析 Json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22045385/

相关文章:

c# - 如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET

json - JSONObject 的 Jackson 2 等价物是什么?

ios - 使用 JSONEncoder 将 nil 值编码为 null

json - Scala:将 JSON 直接解析为案例类

java - 在 JAX-RS 2.0 客户端库中处理自定义错误响应

javascript - IE10/11 Ajax XHR 错误 - SCRIPT7002 : XM

json - 新的@angular/cli 版本中的文件 angular-cli.json 在哪里?

json - 如何在 Angular 2 中获取 JSON 文件

ruby-on-rails - 如何安装 json gem - 无法构建 gem 原生扩展(mac

json - 我应该如何处理 JSON 中的 HATEOAS 链接和引用?