【问题标题】:parsing a Json Array in play framework JsObject在播放框架 JsObject 中解析 Json 数组
【发布时间】:2014-03-29 12:24:31
【问题描述】:

我有以下 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 scala playframework-2.0


    【解决方案1】:

    我认为尽早从 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 类型类实例很好地组合——如果您有这些JsArray对象,例如,您可以只写 array.as[List[Category]] 并得到您所期望的。

    【讨论】:

      【解决方案2】:

      彼得说了什么,或者:

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

      【讨论】:

      • Edit 不,我没有,我的错。实际上,我使用的是“子类别”,而不是“子类别”。感谢您的帮助!
      【解决方案3】:

      类似这样的:

      subCats.map( jsarray => jsarray.value.map(jsvalue => (jsvalue \ "name").as[String]).toList)
      

      这通常会返回一个Option[List[String]]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多