使用Alamofire 4.0和Swfit 3

时间:2017-02-16 20:48:56

标签: swift xcode networking alamofire

我想知道如何解析,从Alamofire中获取API的所有数据。

以下是从API下载一个数据字典的代码。我该如何从中下载其他内容?

以下是JSONFormatter的截图:

http://imgur.com/a/rhxBO

func downloadJsonData (completed: @escaping DownloadCompleted) {
    Alamofire.request(url, method: .get).responseJSON { response in
        let result = response.result.value
        if let dict = result as? [Dictionary<String,AnyObject>] {

            if let id = dict[0]["id"] as? String {
                self._id = id
                print("@@@\(self._id)")
            }

            if let name = dict[0]["name"] as? String {
                self._name = name
                print("@@@\(self._name)")
            }

            if let avatar = dict[0]["avatar"] as? String {
                self._avatar = avatar
                print("@@@\(self._avatar)")
            }

            if let lat = dict[0]["lat"] as? Float {
                self._lat = lat
                print("@@@\(self._lat)")
            }

            if let lng = dict[0]["lng"] as? Float {
                self._lng = lng
                print("@@@\(self._lng)")
            }
        }
    }
    completed()
}

4 个答案:

答案 0 :(得分:3)

func downloadJsonData (completed: @escaping DownloadCompleted) {
    Alamofire.request(url, method: .get).responseJSON { response in
        if let collectionData = response.result.value as? [[String:AnyObject]] {
            let collection : [YourStruct] = collectionData.flatMap { data in
                guard let id = data["id"] as? String,
                    let name = data["name"] as? String,
                    let avatar = data["avatar"] as? String,
                    let lat = data["lat"] as? Float,
                    let lng = data["lng"] as? Float
                else {
                    return nil
                }

                return YourStruct(id:id, name:name, avatar:avatar, lat:lat, lng:lng)
            }
        }
    }
    completed()
}

现在你有了一个对象的集合。有了它,你可以做你想做的事情

答案 1 :(得分:3)

我真的建议你使用一些Object mapper,因为它使解析变得非常简单。您可以按照以下链接:

JsonJoy非常容易使用

  

https://github.com/daltoniam/JSONJoy-Swift

或者您可以在以下链接中查看完整的详细信息:

http://harlankellaway.com/blog/2015/07/05/swift-json-parsing-by-example

否则您可以使用Adrian Bobrowski答案。

答案 2 :(得分:1)

我建议你实现一个自定义对象的映射,这是一个可以帮助你的库,可以与Alamofire集成。

https://github.com/tristanhimmelman/AlamofireObjectMapper

您可以减少所有样板,并且非常容易实现。

如果您还有其他问题,请告诉我。

答案 3 :(得分:1)

我正在使用这样的Alamofire:

let Header          = [ "Authorization" : Token ]
let Parameters      = [:]
var json : JSON     = nil
Alamofire.request(URLString, method: method, parameters: Parameters, headers : Header)
    .responseJSON { response in
        switch response.result {
        case .success(let data):
            json = JSON(data)
            print(json)
        case .failure(let error):
            print("Request failed with error: \(error)")
        }
}
}

所以在那之后你可以解析你的json,例如:

if json != nil {
 let name       = json["name"].stringValue
 let avatar     = json["avatar"].stringValue
 let lng        = json["lng"].doubleValue
 let lat        = json["lat"].doubleValue
}

希望我帮助你,和平