2017-10-18 64 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