2017-03-27 98 views
-1

這個問題已經被問了上百次,但互聯網並沒有幫助,主要是因爲我對swift和編程很陌生,所以我提前道歉。在swift中提取JSON數據

我想從json中提取一些數據。

這裏是我的代碼:

let request = NSMutableURLRequest(url:myUrl! as URL); 
request.httpMethod = "POST"; 

let postString = "email=\(email)"; 

request.httpBody = postString.data(using: String.Encoding.utf8); 

let task = URLSession.shared.dataTask(with: request as URLRequest){ 
    data, response, error in 

    if error != nil { 
     print("error=\(error)") 
     return 
    } 

    var err: NSError? 
    do 
    { 

     let myJson = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
     print(myJson) 
     let name = myJson["name"] 

    } 
    catch let error as NSError { 
     err = error 
    } 
} 
task.resume() 

這裏是JSON出print(myJson)

(
    { 
     name = "TestTest"; 
    } 
) 

但是我收到一個錯誤:

let name = myJson["name"] 

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

+0

你的JSON頂層的對象應該是一個數組或字典,你需要序列化你的對象 –

+0

一如往常,但沒有涉及到的問題'mutableContainers '在Swift中完全沒有意義。並且不要在Swift 3中使用'NSURL/NSMutableURLRequest'。有一些本地結構'URL/URLRequest'。 – vadian

+0

好的,謝謝你的建議! – Jonas

回答

1

你的第一個問題有這條線:

let myJson = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 

您指定數據將是AnyObject類型。但它確實應該是一系列字典。所以,相反,你應該指定:

let myJson = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as [[String:Any]] 

當然,這本身並不能修復的東西,因爲你必須從陣列中提取項目,然後才能使用字典方式就可以得到在「名稱」值。所以,你必須做這樣的事情,在那之後:

let row = myJson[0] 
let name = row["name"] 
+0

@Fahim非常感謝你幫助像我這樣的初學者,這工作!你是對的,我正在做一個Post查詢,因爲這是一個登錄屏幕,在登錄時我想獲取用戶的id(在這種情況下是用戶名),將其用作全局變量。我確定,總是有一行,所以我可以做到沒有for循環? – Jonas

+0

@Jonas高興地幫助:)是的,你可以提取第一行。我相應地修改了我的答案。 – Fahim

+0

使我的一天。希望你有一個好的! – Jonas