2017-01-12 42 views
1

我想處理一個JSON字符串,該字符串作爲來自使用Alamofire進行的HTTP調用的數據返回。Alamofire in Swift:轉換可用JSON字典中的響應數據

This question使用SwiftyJSON

但是我想去一點點「低級別」,並瞭解如何將響應對象轉換成字典。

推理是,它認爲字典可能是訪問響應中的JSON值的簡單/方便的方式(而不必經歷將響應轉換爲JSON對象的過程)。

這是假設JSON對象和字典是一回事下(是誰?)。

下面是我寫的樣本函數:

func question() -> Void{ 
    let response : DataRequest = Alamofire.request("http://aapiurl", parameters: nil) 

    // Working with JSON Apple developer guide: 
    // https://developer.apple.com/swift/blog/?id=37 

    response.responseJSON { response in 
     if let JSON = response.result.value 
     { 

      print("JSON: \(JSON)") // Works! 

      let data = JSON as! NSMutableDictionary 
      // Casting fails 
      // Could not cast value of type '__NSCFArray' (0x19f952150) to 'NSMutableDictionary' (0x19f9523f8). 
      print("Data: \(data)") 
     } 
    } 
} 

編輯:

JSON對象似乎是類型上的所有的,沒有任何的被提議的方法下面的答案。

我曾嘗試將其轉換爲一個字典,並得到下面的錯誤:

enter image description here

+0

這裏'數據'是'NSArray'類型。你可以試試'let data = JSON as! NSArray'。 –

+0

Mhh ...是的有意義。我可以迭代數組並將其轉換爲Dictionary(http:// stackoverflow。COM /問題/ 31446960 /轉換,迅速陣列到字典用的索引)。這是最佳做法嗎?你通常做什麼? – mm24

+0

就像JSON.mutablearray(「key」)一樣! NSMutableDictionary –

回答

0

JSON對象IS一個字典(或可能在頂層陣列)。

請注意,您不應該在斯威夫特使用NSMutableDictionaryNSDictionary(或NSArrayNSMutableArray)。

此外,JSON對象不工作的對象。 JSON是一種移動數據的方式。它不能用作數據源。

如果您希望編輯從JSON獲得,那麼你應該構建從JSON正確的數據對象,並與他們合作的信息。

然後,如果您需要從這個新的數據發送JSON然後你把你的數據對象,並將其轉換回字典和數組(即JSON對象),併發送數據。

+0

謝謝你的答案。在您的體驗中訪問JSON對象的最佳做法是什麼?上面的一個評論意味着我作爲響應得到的數據是一個數組類型..它感覺不是直接將數組轉換成可用的JSON對象(我可以列出所有的鍵和值)。 – mm24

+0

@ mm24如果JSON是一個數組,那麼它將是一組事物。要訪問數組中的鍵和值是沒有意義的。您應該將JSON轉換爲實際Swift對象(可能是結構體)的數組。一旦你完成了,只是忘了JSON。 – Fogmeister

+0

當我查看變量JSON時,它說它是Any類型的。當我嘗試投射字典時失敗(請參閱更新後的問題)。 – mm24

-1
Alamofire.request(myUrl) 
     .responseJSON { 
      response in 

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

       debugPrint(dict) 

       wishLists.removeAll() //[[String:Any]] 

       let lists = dict["wishlists"] as! [String: Any] 

       debugPrint(lists) 

       for (key, value) in lists { 

        var list = value as! [String: Any] 

        wishLists.append(list) 

       } 

       debugPrint(wishLists) 

       self.tableView.reloadData() 

      } 

    } 
+0

這不是Alamofire的工作原理。使用'responseJSON'已經將數據解析爲JSON對象。此外,OP os不會詢問如何將數據解析爲JSON。 – Fogmeister

+0

關於如何處理responseJSON數據,你有一些示例代碼嗎?我想訪問JSON對象的鍵/值對。 – mm24

+0

我根據@Fogmeister的上述評論編輯了我的答案 – markhorrocks

0

Alamofire的結果值爲Any,因爲它通常是數組或字典。在Swift中,您通常不應該使用NS *類,而應該使用原生的快速類型,例如ArrayDictionary

你可以(應該)使用自選尋找到返回的JSON對象:

if let array = response.result.value as? [Any] { 
    print("Got an array with \(array.count) objects") 
} 
else if let dictionary = response.result.value as? [AnyHashable: Any] { 
    print("Got a dictionary: \(dictionary)") 
} 
... 

取決於你從你的後臺會發生什麼,你可以把每一個案件的成功或失敗。

相關問題