2015-10-13 68 views
1

我嘗試使用SwiftyJSON解析JSON,但是我面臨一個問題。SwiftyJSON - 表達不明確

我使用here

這裏的教程是我的代碼

var JSONStorage : [Article?]? 
var objects = [[String: String]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let number = arc4random_uniform(1000) 
    let urlString = "http://78.27.190.58:3200/api/get_article/17?\(number)" 

    if let url = NSURL(string: urlString) { 
     if let data = try? NSData(contentsOfURL: url, options: []) { 
      let json = JSON(data: data) 

      for element in json["article"].arrayValue { 

       let id = Int(element["id"].stringValue) 
       let title = element["title"].stringValue 
       let subtitle = element["subtitle"].stringValue 
       let body = element["body"].stringValue 
       let img = element["images"]["main"].rawValue 
       let obj = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img] 


       objects.append(obj) 

      } 

     } 
    } 

} 

這裏我得到了

enter image description here

什麼我做錯了錯誤?

回答

2

objects[[String:String]]型,詞典的數組。這些字典的鍵值分別爲StringString

但你添加到這個陣列包含不同類型的值的字典:String s的你.stringValue對象和.rawValue其中一個類型必須爲NSData的我相信。

一個解決方案可能是鍵入您的字典[String:AnyObject](因此您的數組[[String:AnyObject]]),並在檢索值時在另一端進行類型轉換。

順便說一句,編譯器說「表達式不明確」,因爲它在推斷數組類型(現在我們知道爲什麼)時失敗。

請注意,它在解析JSON時不是最有效的。更好的方法是從數據中創建對象:類或結構體。例如,您可以使用struct Article來保存每個element的值,就像您在另一個問題中顯示的一樣。

+1

埃裏克,非常感謝你!你是我的救星:) –

0

swift中的數組或字典不能是異構的。如果你看看你的代碼,你想把一個int和四個字符串作爲obj的值。

這將工作:

for element in json["article"].arrayValue { 

      let id = element["id"].stringValue // must be string to put it in obj 
      let title = element["title"].stringValue 
      let subtitle = element["subtitle"].stringValue 
      let body = element["body"].stringValue 
      let img = element["images"]["main"].rawValue 
      let obj: [String: String] = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img] 


      objects.append(obj) 

     }