2016-11-24 28 views
1

我試圖用Alamofire提取的數據更新UITableView在Swift中從json中解析我的數據有什麼問題?

{"hashtags":["test","test2"]} 

和我「爲swift`代碼如下所示:

Alamofire.request("\(serverURL)/users/\(username)/hashtags") 
     .validate() 
     .responseJSON { response in 
switch response.result { 
      case .success: 
       DispatchQueue.main.async(execute: { 

    if let jsonData = response.result.value as? [String: AnyObject] { 

    for hashtag in jsonData { 
     print(JSON(hashtag)) 
     print(hashtag) 
     if let userHashtags = SingleHashtag.fromJSON(JSON(hashtag)){ 

     for hash in userHashtags.hashtagText { 
      print(hash) 
      self.items.add(hash) 

功能SingleHashtag.fromJSON是類的一部分:

class SingleHashtag: NSObject { 

    var hashtagText: [String] 

    init(hashtagText: [String]) { 
     self.hashtagText = hashtagText 
     super.init() 
    } 

    class func fromJSON(_ json: JSON) -> SingleHashtag? { 
     let hashtagText:[String] = json["hashtags"].arrayValue.map { $0.stringValue} 
     return SingleHashtag(hashtagText: hashtagText) 
    } 


} 
我的後端web服務如下返回數據

,我無法使它工作。問題是,這兩條線:

print(JSON(hashtag)) 
print(hashtag) 

打印:

unknown 
("hashtags", <__NSArrayI 0x170c22200>(
test, 
test2 
) 
) 

因爲我傳遞unknown那裏,不執行代碼的其餘部分。我在這裏錯過了什麼?

回答

2

你的JSON似乎是一個字典,只有鍵包含一個字符串數組。

你試圖循環你的dictinionary,就好像它是一個數組。這是錯誤的。

嘗試使用2步可選的結合是這樣的:

if let jsonData = response.result.value as? [String: AnyObject], 
     hashtags = jsonData["hashtags"] as? [String] { 
    for hashtag in hashtags { 
     //your code here 
    } 
} 
+0

鄧肯,我想你的解決方案,但我得到這個錯誤http://imgur.com/a/X0HVm好像我不能讓兩步驟結合... – user3766930

+0

語法斯威夫特2之間變化和斯威夫特3,我永遠不會記得哪個是正確的。您發佈的屏幕截圖顯示瞭如何修復它。看看你是否可以解決這個問題。 –

1

如果你知道你的JSON數據的結構將是與一個字符串數組作爲其值([String: [String]])一本字典,您應該如此投射,而不是將其投射爲[String: AnyObject]

然後,您可以遍歷字典中包含的數組,並期望獲得字符串值。

if let jsonData = response.result.value as? [String: [String]] { 

     for hashtag in jsonData["hashtags"] { 
      print(hashtag) 
      // and so on 
     } 
    }