2017-03-02 7 views
0

を再生する:解析JS目的は、以下のJSONから車としてポルシェを持っている人のIDを見つけることです

{ 
    "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を、私は見つけることができません

車の値が「Porsche」である人物配列内のノードを見つけて、そのノードから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] 
} 

Scalaの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

関連する問題