Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在play framework JsObject中解析Json数组_Json_Scala_Playframework 2.0 - Fatal编程技术网

在play framework JsObject中解析Json数组

在play framework JsObject中解析Json数组,json,scala,playframework-2.0,Json,Scala,Playframework 2.0,我有以下Json: { "web-category" : "macaroons", "sub-categories" : [ { "name" : "pink" }, { "name" : "blue" }, { "name" : "green" } ] } 我把它作为一个对象来使用。因此,我现在可以成功地执行以下操作: //(o is the JsObject) val webCat:Option[String] = (o \ "web-cate

我有以下Json:

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

}
我把它作为一个对象来使用。因此,我现在可以成功地执行以下操作:

//(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")
subCats.map( jsarray => jsarray.value.map(jsvalue => (jsvalue \ "name").as[String]).toList)
不知道如何访问JsArray

谢谢你在这方面的帮助。

诸如此类:

List("blue", "green", "pink")
subCats.map( jsarray => jsarray.value.map(jsvalue => (jsvalue \ "name").as[String]).toList)
这通常会返回一个
选项[List[String]]
Peter说的话,或者:

(o \ "sub-categories" \\ "name").map(_.as[String]).toList

我认为尽早从JSON领域转移到原生Scala表示领域通常是个好主意。例如,如果
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]
后一种方法使错误处理更加清晰(例如,您可以在这个顶层用
asOpt
替换
as
),并且如果您有这些对象的
JsArray
类型类实例,则可以与其他
读取类型类实例很好地组合,例如,您可以将
array.as[List[Category]]
然后得到你想要的。

不,我没有,我的错。我实际上使用了“子类别”,而不是“子类别”。谢谢你的帮助!