2017-03-02 56 views
0

的目標是找到具有保時捷從下面的JSON車的人的ID:解析JS Scala中播放

{ 
    "people": [ 
     { 
      "id": "1", 
      "name": "John", 
      "car": "Ford" 
     }, 
     { 
      "id": "2", 
      "name": "Andrew", 
      "car": "Porsche" 
     }, 
     { 
      "id": "3", 
      "name": "Joshua", 
      "car": "Mercedes" 
     } 
    ] 
} 

使用這個作爲一個例子:https://www.playframework.com/documentation/2.5.x/ScalaJsonCombinators,我無法找到任何允許我這樣做的代碼:

查找具有car值「Porsche」的people數組中的節點,然後從該節點檢索ID。

val cars = json \ "people" \\ "car" 

返回汽車列表,但這不是我想要做的。

有沒有簡單的方法來查詢Json?

回答

2

請執行以下操作。首先創建一個表示json結構的case類。

case class Person(id: String, name: String, car: String) 

object Person { 
implicit val personFormat = Json.format[Person] 
} 

case class People(people: List[Person]) 

object People { 
    implicit val peopleFormat = Json.format[People] 
} 

斯卡拉REPL

Now parse the json 
scala> val str = """ 
    | { 
    |  "people": [ 
    |   { 
    |   "id": "1", 
    |   "name": "John", 
    |   "car": "Ford" 
    |   }, 
    |   { 
    |   "id": "2", 
    |   "name": "Andrew", 
    |   "car": "Porsche" 
    |   }, 
    |   { 
    |   "id": "3", 
    |   "name": "Joshua", 
    |   "car": "Mercedes" 
    |   } 
    |  ] 
    | } 
    | """.trim 

scala> Json.parse(str).validate[People] 
res5: play.api.libs.json.JsResult[People] = JsSuccess(People(List(Person(1,John,Ford), Person(2,Andrew,Porsche), Person(3,Joshua,Mercedes))),/people) 

scala> Json.parse(str).validate[People] match { 
    | case JsSuccess(value, _) => value.people.collectFirst { case Person(id, _, "Porsche") => id } 
    | case JsError(errors) => None 
    | } 
res7: Option[String] = Some(2) 

最後分析和收集第一

Json.parse(str).validate[People] match { 
    case JsSuccess(value, _) => value.people.collectFirst { case Person(id, _, "Porsche") => id } 
    case JsError(errors) => None 
} 
+1

完美,非常感謝! – Pierre