json - 我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?

标签 json swift xcode get alamofire

我正在尝试使用 Alamofire 和 SwiftyJSON 从 API 解析 JSON,但在尝试访问 JSON 中的信息时遇到了问题。我需要简单地解析名为“ask_price”的项目的 JSON:还有“time_coinapi”,但我不确定如何管理响应,或者我是否必须使用不同的方法。这是我目前拥有的:

class CoinAPIManager {

var prices: [String] = []
var times: [String] = []


static let shared = CoinAPIManager()

func getReq() {

    let headers: HTTPHeaders = [
        "X-CoinAPI-Key": "Key"
    ]


    Alamofire.request("https://rest.coinapi.io/v1/quotes/BITSTAMP_SPOT_BTC_USD/history?time_start=2018-08-21T00:00:00&time_end=2018-08-22T00:00:00&limit=100", headers: headers).responseJSON { response in
        debugPrint(response)

        if let data = try? String(contentsOf: response) {
            let json = JSON(parseJSON: data)


            parse(json: json)


        }



}



    func parse(json: JSON) {
        for result in json[].arrayValue {
            let price = result["ask_price"].stringValue


        }

    }

}
}

我也试过这个:

func getReq() {

    let headers: HTTPHeaders = [
        "X-CoinAPI-Key": "Key"
    ]


    Alamofire.request("https://rest.coinapi.io/v1/quotes/BITSTAMP_SPOT_BTC_USD/history?time_start=2018-08-21T00:00:00&time_end=2018-08-22T00:00:00&limit=100", headers: headers).responseJSON { response in
        debugPrint(response)

        switch response.result {
        case .failure(let error):
            // Do whatever here
            return

        case .success(let data):
            // First make sure you got back a dictionary if that's what you expect
            guard let json = data as? [String : AnyObject] else {
                print("Failed to get expected response from webserver.")
                return
            }

            // Then make sure you get the actual key/value types you expect
            guard var price = json["ask_price"] as? Double else {
                    print("Failed to get data from webserver")
                    return
            }



}

我做错了什么?这是 JSON 的样子:

[
  {
"symbol_id": "BITSTAMP_SPOT_BTC_USD",
"time_exchange": "2013-09-28T22:40:50.0000000Z",
"time_coinapi": "2017-03-18T22:42:21.3763342Z",
"ask_price": 770.000000000,
"ask_size": 3252,
"bid_price": 760,
"bid_size": 124
  },
  {
"symbol_id": "BITSTAMP_SPOT_BTC_USD",
"time_exchange": "2013-09-28T22:40:50.0000000",
"time_coinapi": "2017-03-18T22:42:21.3763342",
"ask_price": 770.000000000,
"ask_size": 3252,
"bid_price": 760,
"bid_size": 124
  }
]

上一题因大错删除重发

最佳答案

您需要像这样更改对 SwiftyJSON 对象的响应

Alamofire.request("https://rest.coinapi.io/v1/quotes/BITSTAMP_SPOT_BTC_USD/history?time_start=2018-08-21T00:00:00&time_end=2018-08-22T00:00:00&limit=100", headers: headers).responseJSON { response in
        debugPrint(response)

        switch response.result {
        case .failure(let error):
            // Do whatever here
            return

        case .success:
            // First make sure you got back a dictionary if that's what you expect
                let responseJSON = JSON(response.result.value!)
                if responseJSON.count != 0 {
                    print(responseJSON)
                    //do whatever you want with your object json
                }
        }
}

我建议在你的 ApiManager 中你可以使用完成 block 来管理异步请求,检查下一个代码。

  class func getRequestWithoutParams(didSuccess:@escaping (_ message: JSON) -> Void, didFail: @escaping (_ alert:UIAlertController)->Void){



    Alamofire.request("http://foo.bar"),method: .post,parameters: parameters,encoding: JSONEncoding.default,headers:nil).responseJSON { response in
                switch response.result{
                case .success:
                    let res = JSON(response.result.value!)
                    didSuccess(res)
                    break
                case .failure(let error):
                    let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)
                    let done = UIAlertAction(title: "OK", style: .default, handler: nil)
                    alert.addAction(done)
                    didFail(alert)
                }
            }

}

关于json - 我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51991151/

相关文章:

c# - Json.net 反序列化具有非字符串键类型的嵌套字典

php - 从android中的mysql数据库中检索edittext中的数据

两个 Controller 之间的 iOS 对象或委托(delegate)?

ios - 'mapView(_:viewFor:)' 的重新声明无效

python - 如何获取多个JSON对象的值?

php - JSON 持久化/DOM

swift - Xcode segues 不工作

ios - 两个函数从 FireBase 数据库获取数据,第三个函数执行一些计算

ios - Xcode6 beta4 的问题

xcode - 如何初始化相互依赖的属性