2017-03-02 8 views
0

Ziel ist die ID der Person zu finden, die einen Porsche als ein Auto aus der folgenden json hat:Parsing JS in Scala Spielen

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

diese Verwendung als Beispiel: https://www.playframework.com/documentation/2.5.x/ScalaJsonCombinators, kann ich nicht finden Jeder Code, mit dem ich dies tun kann:

Suchen Sie den Knoten in der Personen-Array, die einen Auto-Wert von "Porsche" hat, und dann die ID von diesem Knoten abrufen.

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

gibt eine Liste von Autos zurück, aber das ist nicht das, was ich tun möchte.

Gibt es eine einfache Möglichkeit, Abfragen auf dem Json zu tun?

Antwort

2

Gehen Sie wie folgt vor. Erstellen Sie zuerst eine Fallklasse, die die JSON-Struktur darstellt.

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) 

Schließlich analysieren und erste

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

Perfect, thanks so much sammeln! – Pierre