Swift中的Alamofire:在可用的JSON字典中转换响应数据

时间:2017-01-12 12:49:40

标签: json swift dictionary alamofire type-conversion

我想处理一个JSON字符串,该字符串作为使用 Alamofire 进行的HTTP调用的数据返回。

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对象似乎是Any类型,并且没有以下答案中建议的任何方法。

我试图将其转换为字典并得到以下错误:

enter image description here

3 个答案:

答案 0 :(得分:0)

JSON对象 IS 一个词典(或者可能是顶层的数组)。

请注意,您不应在Swift中使用NSMutableDictionaryNSDictionary(或NSArrayNSMutableArray)。

此外,JSON对象不是工作对象。 JSON是一种移动数据的方法。它不能用作数据源。

如果您想编辑从JSON获得的信息,那么您应该从该JSON构造适当的数据对象并使用它们。

如果您需要从这些新数据发送JSON,那么您将获取数据对象并将其转换回字典和数组(即JSON对象)并发送该数据。

答案 1 :(得分:0)

Alamofire的结果值为Any,因为它通常是数组或字典。在Swift中,您通常不应该使用NS *类,而应使用本地swift类型,例如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)")
}
...

根据您对后端的期望,您可以将每个案例视为成功或失败。

答案 2 :(得分:-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()

            }

    }