2017-10-20 44 views
0

我想解析這個JSON數據結構返回從一個URLSession包含項目的資源信息。儘管許多方法沒有達到我需要訪問數據的級別。如何解析複雜的JSON數據結構與斯威夫特3

具體而言,我需要獲取作爲r的計劃員角色的作業狀態以及J:後面的s:的狀態。

因此,我認爲我需要遍歷所有值來查找規劃師角色的狀態,或者有沒有一種方法來指定我正在尋找規劃師並直接能夠檢索其狀態?

我不知道如何遍歷它來達到這個水平,這個問題的有趣但有挑戰性的部分之一是有三個值的資源,所以我不認爲字典鍵值對是正確的模式。

{ 
    "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" 
    } 
    ] 
} 

我試過多種解決方案試圖訪問它,基於各種SO答案,這article

我可以打印JSON對象爲一個字符串:

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

,但我不確定這是否是檢索其值的最佳方式。

絕對感謝您的建議。

回答

-1

只是開始,但應該讓你滾動。我分析它,直到workProduct

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

這就產生了這樣的事情:

{ 
    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] 

只是繼續解析,直到你得到你想要的東西。

+0

感謝 - 所以我不斷加入字典,我看到了[和我看到一個{?這是否是巧合,資源內部的數據不再與我的代碼中的集合相匹配?例如,請注意,高級職員現在與架構師並且有代碼s而不是l?我認爲這是使用字典時的問題-whcih不能保證順序,但最內層的關鍵值對失去了完整性。你明白我的意思嗎?謝謝 – Jazzmine

+0

[]是一個數組,{}是一個字典。你說得對,字典是無序的。我建議你閱讀更多關於NSJsonSerialization的內容,並找到更多關於如何使用它的例子。 – RaffAl

0

這將是混亂。

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 
} 

做一個初始化init(json: [String: Any])

使用其他第三方庫

https://github.com/SwiftyJSON/SwiftyJSON