2017-10-20 53 views
0

J'essaie d'analyser cette structure de données JSON renvoyée à partir d'une URLSession contenant des informations de ressources pour un projet. Malgré de nombreuses approches, je n'arrive pas au niveau dont j'ai besoin pour accéder aux données.Comment analyser une structure de données JSON complexe avec Swift 3

Plus précisément, j'ai besoin d'obtenir l'état du travail pour le rôle de planificateur qui est le r: et l'état qui suit le s: dans le JSON.

Donc je pense que j'ai besoin de parcourir toutes les valeurs pour trouver le statut pour le rôle de planificateur ou est-il un moyen de spécifier que je suis à la recherche de planificateur et directement en mesure de récupérer le statut? Je ne suis pas sûr de savoir comment le traverser pour arriver à ce niveau, l'une des parties intéressantes mais difficiles de ce problème est qu'il y a trois valeurs pour la ressource, donc je ne pense pas qu'une paire de valeurs de clé de dictionnaire soit le bon modèle.

{ 
    "Project": 43, 
    "definition": [ 
    { 
     "statusCode": 0, 
     "entryID": "123", 
     "Initiatives": [], 
     "validationCode": "1.0.0" 
    }, 
    { 
     "statusCode": 0, 
     "workProduct": [ 
     { 
      "task": [ 
      { 
       "desc": "define project scope", 
       "hours": 120, 
       "week": "1", 
       "resources": [ 
       { 
        "r": "planner", 
        "l": "junior", 
        "s": "open" 
       }, 
       { 
        "r": "architect", 
        "s": "senior", 
        "s": "filled" 
       } 
       ], 
       "managerCode": "1285", 
       "teamCode": [ 
       "413" 
       ] 
      } 
      ], 
      "scope": "project design" 
     } 
     ], 
     "entryID": "123", 
     "validationCode": "1.0.0" 
    } 
    ] 
} 

J'ai essayé plusieurs solutions qui tentent d'y accéder, en fonction de diverses réponses SO et ce article:

je peux imprimer l'objet JSON comme une chaîne:

let stringData = String(data: projectInformation!, encoding: String.Encoding.utf8) 
      print(stringData as Any) //JSONSerialization 

Mais suis pas sûr que ce serait un moyen optimal de récupérer les valeurs pour cela.

Appréciez vos suggestions.

Répondre

-1

Juste le début, mais devrait vous aider à rouler. J'analysables jusqu'à workProduct:

let object = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: AnyObject] 
let dictionaryItem = object["definition"]![1] as! [String: AnyObject] 
let workProductItems = dictionaryItem["workProduct"] 

Cela donne quelque chose comme ceci:

{ 
    scope = "project design"; 
    task =  (
       { 
      desc = "define project scope"; 
      hours = 120; 
      managerCode = 1285; 
      resources =    (
           { 
        l = junior; 
        r = planner; 
        s = open; 
       }, 
           { 
        r = architect; 
        s = senior; 
       } 
      ); 
      teamCode =    (
       413 
      ); 
      week = 1; 
     } 
    ); 
} 
) 
, "validationCode": 1.0.0] 

Il suffit de continuer l'analyse syntaxique jusqu'à ce que vous obtenez ce que vous voulez.

+0

Merci - donc je continue à ajouter le dictionnaire où je vois un [ et un tableau où je vois un {? Est-ce une coïncidence que les données à l'intérieur des ressources ne correspondent plus à l'ensemble de mon code? Par exemple, remarquez que senior est maintenant avec architecte et a un code de s au lieu de l? Je pense que c'est un problème avec l'utilisation du dictionnaire -whcih ne garantit pas l'ordre, mais les paires de valeurs clés au niveau le plus interne pour les ressources ont perdu leur intégrité. Est-ce que tu vois ce que je veux dire? Merci – Jazzmine

+0

[] est un tableau, {} est un dictionnaire. Et vous avez raison, les dictionnaires ne sont pas ordonnés. Je vous recommande de lire plus sur NSJsonSerialization et de trouver plus d'exemples sur la façon de l'utiliser. – RaffAl

0

Ce serait salissant.

do{ 
    let json = try JSONSerialization.jsonObject(with: data) as? [String: Any] 

    if let project = json["Project"] as? Int { 
    //do something 
    } 
    if let definition = json["definition"] as? [DefinitionType] { 
    // do something 
    } 
} catch { 
    //error 
} 

ou

faire un initialiseur init(json: [String: Any])

ou

utiliser d'autres bibliothèques 3ème partie

https://github.com/SwiftyJSON/SwiftyJSON