2017-01-25 91 views
1

所以我遇到了Swift 3的問題。我向我的服務器發送了一個get調用,並且我得到了我期望的數據。但我不知道如何從jsonArray創建對象,以便我可以輕鬆訪問數據。Swift 3 - 無法弄清楚如何從jsonArray創建json對象

這是迄今爲止我FUNC:

func getAllRoles(refreshToken: String){ 
    print("vi kører getAllRoles \(refreshToken)") 

    let urlPath = "http://keebintest-pagh.rhcloud.com/api/users/allroles/" 
    let url = NSURL(string: urlPath) 
    let session = URLSession.shared 
    let request = NSMutableURLRequest(url: url as! URL) 

    request.addValue(refreshToken, forHTTPHeaderField: "refreshToken") 
    request.httpMethod = "GET" 



    let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in 
     print("Task completed \(data) and response is xxxx") 

     let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
     print("responseString = \(responseString!)") 



     //   Her laver vi data om til en dictionary 
     //   let s = (try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers)) as! String 
     //   print("det virkede?") 
     //   print(s) 

     //   var json: Array<String>! 
     //   do { 
     //    json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions()) as? Array 
     //   } catch { 
     //    print(error) 
     //   } 
     // 
     //   print("her er mit json \(json[0])") 






    }) 
    task.resume() 
} 

這是我的控制檯日誌是這樣的:

Task completed Optional(56 bytes) and response is xxxx 
responseString = [{"id":1,"roleName":"Admin"},{"id":2,"roleName":"User"}] 
here is my json { 
    id = 2; 
    roleName = User; 
} 

所以,很顯然,我得到我的數據,這是一個數組,我可以訪問。不過,我不知道如何從數組中的每個人創建jsonObjects。有人可以幫忙嗎?

在此先感謝!

+0

可能重複的[將一個JSON數組反序列化爲一個Swift數組對象](http://stackoverflow.com/questions/37149588/deserialize-a-json-array-to-a-swift - 對象的陣列) – shallowThought

回答

0

你的問題是,響應不是字符串數組(Array<String>),其Dictionary<String,Any>陣列(Array<Dictionary<String,Any>>或更簡單地[[字符串:任何]])。請嘗試以下操作:

var json: [[String:Any]]! 
do { 
    json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [[String:Any]] 
} catch { 
    print(error) 
} 

雖然我建議不要使用「!」並採用自選或違約,而不是像:

var json:[[String:Any]] = [] 
if let data = data, let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String:Any]] { 
    json = jsonResponse 
} 

現在作爲「JSON對象,」你想,最接近於在SWIFT是一個詞典這是在我的例子JSON數組英寸所以json[0]["id"]將返回1.

+0

這有效奇蹟!謝謝一堆。 –

0

我不是100%確定我明白你的意思是「從jsonArray創建對象,以便我可以輕鬆訪問數據」,但假設你只是想將數據從json和模型對象中取出,看起來你已經走上了正確的道路。只需將數據饋送到陣列構建器,然後解析它...

if let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]], 
     let role = (JSONObject[0]["roleName"] as? [String: Any])?["roleName"] as? String { 
     // do something with the role name here 
    } 

當然,[0]會被替換爲循環索引。這段代碼很難看,所以我會建議採取Russel的建議,這使得它更清潔。