2016-04-05 55 views
1

我是Swift和JSON的新手,遇到了麻煩。我已經在這裏看過各種Q & A,並試圖引入這些建議,但是我沒有正確地做到這一點。Swift JSON序列化錯誤

我有服務器根據JSON皮棉檢查器(http://jsonlint.com)生成JSON。

使用瀏覽器的響應是這樣的:

[{ 「郵編」: 「NW4 2JL」},{ 「POSTALCODE」: 「NW4 2ES」},{ 「POSTALCODE」: 「NW4 3XP」} ,{「PostalCode」:「NW4 4DU」},{「PostalCode」:「NW4 2HH」},{「PostalCode」:「NW4 2DR」},{「PostalCode」:「NW4 2DX」}]

Xcode ,但是,給我這個錯誤:

錯誤,抱歉,無法解析JSON:可選([{「PostalCode」:「NW4 2JL」},{「PostalCode」:「NW4 2ES」},{「PostalCode」 :「NW4 3XP」},{「PostalCode」:「NW4 4DU」},{「PostalCode」:「NW4 2HH」},{「PostalCode」:「NW4 2DR」},{「PostalCode」:「NW4 2DX」} ])

什麼讓我感到困惑,我找不到解釋,是'Optional()'部分。在此之前,錯誤陳述正如我在第12行(唯一包含「對不起」一詞的消息)所寫的那樣。 '()'內的JSON看起來很好。

任何人都可以建議我在這裏做錯了什麼,或者至少在'可選()'文本來自哪裏?

這是我的代碼的相關部分:

let task = session.dataTaskWithRequest(request) { data, response, error in 
     guard data != nil else { 
      print("no data found: \(error)") 
      return 
     } 
     do { 
      if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary { 
       let success = json["success"] as? Int 
       print("Success: \(success)") 
      } else { 
       let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print("Error, sorry, could not parse JSON: \(jsonStr)") 
      } 
     } catch let parseError { 
      print(parseError) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
     } 
    } 
+0

@Eric D:可選項也可能是短暫的,我想他們出於回溯兼容性的原因,並不是因爲他們聰明 –

+0

@IBelBell可選項是Swift的一個關鍵概念,Chris Lattner多次說過。他們很快就不會去。 :) – Moritz

+0

哇這個網站是好的。只要我發佈這個,我在其他地方找到了答案(http://stackoverflow.com/questions/8356842/how-to-use-nsjsonserialization)。真對不起。解決方案是使用NSArray而不是NSDictionary,因爲,響應是一個數組。 – Denis

回答

0

這一行:

let success = json["success"] as? Int 

你讓success可選。由於可選項符合協議CustomStringConvertible,因此您將「可選(...)」作爲字符串

如果你還不知道什麼是可選的,停止一切並去了解它。現在。 ;)

完成?好吧,現在安全地打開可選的例如可選裝訂:

if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { 
    if let success = json["success"] as? Int { 
     print("Success: \(success)") 
    } 
} 

就是這樣。

請注意,在這裏我們要訪問一個字典,但在你的問題的JSON是字典的陣列:這是一個有點不清楚你確實有。