2017-10-18 57 views
0

给出的JSON值:你怎么在多个JSON提取顶级域对象

val json = Json.parse(
""" 
    |[{ 
    |  "name" : "Agency Co", 
    |  "worker" :{ 
    |  "FirstName" : "Bob", 
    |  "age" : 44, 
    |  "role" : null 
    |  } 
    | }, 
    | { 
    |  "name" : "Agency Inc", 
    |  "worker" :{ 
    |  "FirstName" : "Robby", 
    |  "age" : 23, 
    |  "role" : null 
    |  } 
    | }] 
""") 

当你这样做:

(json \\ "FirstName").map(_.asOpt[String].getOrElse("Cannot find field")).toList 

和 “FirstNames” 列表会返回:

List("Bob", "Robby") 

Howev呃,即使有两个不同的事件发生,“(name)”字段上的(“\\”)递归查找也不会起作用。使用(“\”)将只返回第一次出现我需要一个“名称”列表。

如何在不同的对象中返回多个顶级“名称”值?

+0

'.validate [列表[JsObject]。图(_。flatMap {OBJ =>(OBJ \\“姓).asOpt [字符串]})'或'而验证[列表[T]] ''T'是具有name属性(或Value类)的case类 – cchantep

+0

@cchantep感谢您领导正确的方向,但是我需要“name”字段而不是FirstName字段,并且使用validate将只返回一个JsResult并需要一个匹配的情况下,只返回JsResult。你提供的代码没有编译。我已经解决了这个问题,我会在这个评论后提交一个帖子的答案,但谢谢你。 – ZDevelop94

回答

0
val listOfObjects: List[JsObject] = json.asOpt[List[JsObject]] match { 
     case Some(x) => x 
     case _ => List.empty[JsObject] 
    } 
    listOfObjects.map(releaseObject => (releaseObject \ "name") 
     .asOpt[String].getOrElse("Cannot find field")) 
} 
+0

相反,使用'validate',接受'JsValue '这不是'JsObject'的'JsArray'似乎无效 – cchantep

+0

@cchantep当你想用'List [St]做其他事情时'validate'不起作用环]'验证返回'JsResult [List [String]'。例如,如果您想转换列表并将其作为新值返回,则不能使用“验证”。 asOpt'返回'Option [T]',并使用'getOrElse'来获取实际值。 – ZDevelop94

+0

我从未说过验证[List [String]],使用Option作为验证类型通常是奇怪的 – cchantep