【问题标题】:Parsing through array of dictionaries with Alamofire 4.0 and Swfit 3使用 Alamofire 4.0 和 Swfit 3 解析字典数组
【发布时间】:2017-07-06 04:12:48
【问题描述】:

我想知道如何解析,从 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()
}

【问题讨论】:

    标签: swift xcode networking alamofire


    【解决方案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
    }
    

    希望我能帮助你,和平

    【讨论】:

      【解决方案2】:

      我真的建议您使用一些对象映射器,因为它使解析变得超级容易。您可以点击以下链接:

      JsonJoy 非常好用

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

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

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

      否则,您可以使用Adrian Bobrowski 回答。

      【讨论】:

        【解决方案3】:

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

        https://github.com/tristanhimmelman/AlamofireObjectMapper

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

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

        【讨论】:

          【解决方案4】:
          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()
          }
          

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

          【讨论】:

          • 好吧,我不能返回 Struct。它在代码的第 4 行向我显示了错误,上面写着:“无法在当前上下文中推断闭包类型”
          • 嗯......它几乎是完美的,但它在整个数组上迭代 10 次......当我打印出 collectionData 时,它显示了一大堆字典。不知道如何解决这个问题:O
          • 打印collectionData 的位置和原因。在 flatMap 之后,您收集了您的对象 (collection)。你可以打印出来
          • 啊啊啊!好的,我现在明白一切了!非常感谢您的帮助:D
          • @Tonamini 如果我帮助了你,请接受并喜欢我的回答
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 2018-01-05
          • 2017-01-20
          • 2020-04-20
          • 1970-01-01
          • 2016-09-30
          相关资源
          最近更新 更多