2017-10-18 40 views
0

compte tenu de la JSON Valeur:Comment comptez-vous extraire des champs de haut niveau dans plusieurs JSON objets

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

quand vous faites:

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

et une liste des "prénoms" sera retourné:

List("Bob", "Robby") 

Howev er, rien ne sera trouvé avec une recherche récursive ("\\") sur le champ "nom" ne fonctionnera pas même s'il y en a deux occurrences différentes. Utiliser ("\") ne retournera que la première occurrence J'ai besoin d'une liste de "noms".

Comment renvoyez-vous plusieurs valeurs de "nom" de niveau supérieur dans différents objets?

+0

'.validate [Liste [JSObject]]. Carte (_. FlatMap {obj => (obj \\ « FirstName) .asOpt [chaîne]}) '' ou plutôt valider [Liste [T]] 'avec' T' étant une classe de cas ayant le nom properties (ou une classe Value) – cchantep

+0

@cchantep Merci d'avoir dirigé dans la bonne direction, mais j'avais besoin du champ "name" et non du champ FirstName et l'utilisation de validate ne retournera qu'un JsResult Le code que vous avez fourni n'a pas été compilé J'ai résolu le problème Je vais soumettre la réponse dans un post après ce commentaire Merci, merci – ZDevelop94

Répondre

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

Utilisez plutôt 'validate', en acceptant un' JsValue 'ce qui n'est pas un' JsArray' de 'JsObject' semble invalide – cchantep

+0

@cchantep' validate' ne fonctionne pas quand vous voulez aller faire autre chose avec 'List [St ring] 'comme validate retourne' JsResult [List [String] '. Par exemple, si vous voulez transformer la liste et la renvoyer comme une nouvelle valeur, vous ne pouvez pas le faire avec 'validate'. Où 'asOpt' renvoie' Option [T] 'et vous utilisez' getOrElse' pour en extraire la valeur réelle. – ZDevelop94

+0

Je n'ai jamais dit 'validate [List [String]]', en utilisant 'Option' comme type de validation est généralement bizarre – cchantep