2017-03-02 26 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