Zur*_*iar 35 json scala playframework-2.0
我有以下Json:
{
"web-category" : "macaroons",
"sub-categories" : [
{ "name" : "pink" },
{ "name" : "blue" },
{ "name" : "green" }
]
}
Run Code Online (Sandbox Code Playgroud)
我在Play中作为JsObject得到它.所以我现在可以成功地做到以下几点:
//(o is the JsObject)
val webCat:Option[String] = (o \ "web-category").asOpt[String]
println(webCat.toString)
>> Some(macaroons)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是如何访问数组Json对象?我有这个...
val subCats:Option[JsArray] = (o \ "sub-categories").asOpt[JsArray]
println(subCats.toString)
>> Some([{"name" : "blue"},{"name" : "green"},{"name" : "pink"}])
Run Code Online (Sandbox Code Playgroud)
但我需要的是获取JsArray并得到所有名称的List,如下所示:
List("blue", "green", "pink")
Run Code Online (Sandbox Code Playgroud)
不知道如何访问JsArray.
谢谢你的帮助.
Tra*_*own 32
我认为,尽早从JSON-land迁移到本地Scala-representation-land通常是一个好主意.例如,如果obj是你的话JsObject,你可以这样写:
val subCategories = (obj \ "sub-categories").as[List[Map[String, String]]]
val names = subCategories.map(_("name"))
Run Code Online (Sandbox Code Playgroud)
甚至:
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)
Run Code Online (Sandbox Code Playgroud)
然后:
obj.as[Category]
Run Code Online (Sandbox Code Playgroud)
后一种方法使得错误处理更加清晰(例如,你只as需要asOpt在这个顶层替换)并与其他Reads类型类实例很好地组合 - 例如,如果你有JsArray这些对象,你可以只编写array.as[List[Category]]并获得你期望的结果.
joh*_*ren 11
彼得说的话,或者:
(o \ "sub-categories" \\ "name").map(_.as[String]).toList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26629 次 |
| 最近记录: |