Ios 如何从这个数组中获取所需的数据?

Ios 如何从这个数组中获取所需的数据?,ios,arrays,json,swift,charts,Ios,Arrays,Json,Swift,Charts,我需要从API解析JSON以获得两个数据数组,一个用于Times,一个用于price 请求如下: func getReq(arr: Bool, completion: @escaping (Bool) -> ()){ Dates.shared.formatDate() switch graphSetup { case .day: days = "1" case .week: days = "14" } le

我需要从API解析JSON以获得两个数据数组,一个用于Times,一个用于price

请求如下:

func getReq(arr: Bool, completion: @escaping (Bool) -> ()){
    Dates.shared.formatDate()

    switch graphSetup {
    case .day:
        days = "1"
    case .week:
        days = "14"
    }

    let url = "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=1"

    Alamofire.request(url).responseJSON { response in
        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
            let responseJSON = JSON(response.result.value!)
            if responseJSON.count != 0 {

                //do whatever you want with your object json

                parse(json: responseJSON)
                print(responseJSON)
                let gd = responseJSON["prices"].arrayValue

                completion(arr)
            }
        }
    }
这正是JSON返回的printresponseJSON,我缩短了它

let json = "{
  "prices" : [
[
  1535841336422,
  7186.4600704446984
],
[
  1535841628453,
  7187.2085293179398
],
[
  1535841936398,
  7189.7057414152769
],
... many others ...,
[
  1535889024161,
  7210.4807839639352
],
[
  1535889339150,
  7211.0670314913395
 ]
]
}"
解析之后,我得到这个数组。如何将时间与价格分开,同时保持正确的顺序,以便创建以[时间]为x轴,[价格]为y轴的图表

我是这样想的:

var times: [Int] = [] // Will probably convert to traditional date for chart
var prices: [Double] = []
因此,我最终得出以下结论:

print(times)
[1535837138223,1535837424517,1535837741575,...]
print(prices)
[5560.902754859002,5542.734892949798,5539.4334214537,...]

现在可以正确设置图表了。我该怎么做?或者,如果有更好的方法设置我的图表数据,我正在使用danielgindi/Charts for iOS,请告诉我。

您需要构建数据结构并创建自定义编码器/解码器,以对不同数据类型的数组进行编码/解码UInt64 epoch unix时间和双倍价格:

struct Root: Codable {
    let prices: [Price]
}
struct Price: Codable {
    let date: Date
    let price: Double
}
操场测试:

let json = """
{"prices": [[1535837138223,5560.902754859002],
            [1535837424517,5542.734892949798],
            [1535837741575,5539.4334214537]]}
"""

do {
    let prices = try JSONDecoder().decode(Root.self, from: Data(json.utf8)).prices
    print(prices.first!.date.description(with:.current))  // "Saturday, September 1, 2018 at 6:25:38 PM Brasilia Standard Time\n"
    print(prices.first!.price)  // "5560.902754859\n"

} catch {
    print(error)
}

显示用户返回的jsonserver@LeoDabus抱歉,问题中的第一部分代码是从服务器返回的内容。我将编辑并添加所有其他详细信息returns@LeoDabus编辑为打印响应时控制台显示的内容。如果有人能给出否决票的原因,以便我能改进,谢谢。非常有用谢谢。我想我明白发生了什么,只是想澄清一下,请尝试JSONDecoder.decodeRoot.self,from:Datajson.utf8,我会把我的响应放在如下位置:try JSONDecoder.decodeRoot.self,from:DataresponseJSON.utf8正确吗?我会在早上尝试并让您知道。只需在您的成功案例中用数据响应response.data替换Datajson.utf8。alamofire请求中的数据就可以了。效果非常好,我正在尝试找出如何获取所有值并添加到新数组中,因为我只能单独访问它们。例如,我如何打印prices结构中的所有价格,或者在prices.price中附加一个包含所有值的数组,因为我只能访问prices.first!。价格或价格。最后!。价格,我知道了,'价格中的元素{printfelement.price}'
extension UInt64 {
    var date: Date {
        return Date(timeIntervalSince1970: TimeInterval(self)/1000)
    }
}
extension Date {
    var unixEpochTime: UInt64 {
        return UInt64(timeIntervalSince1970*1000)
    }
}
let json = """
{"prices": [[1535837138223,5560.902754859002],
            [1535837424517,5542.734892949798],
            [1535837741575,5539.4334214537]]}
"""

do {
    let prices = try JSONDecoder().decode(Root.self, from: Data(json.utf8)).prices
    print(prices.first!.date.description(with:.current))  // "Saturday, September 1, 2018 at 6:25:38 PM Brasilia Standard Time\n"
    print(prices.first!.price)  // "5560.902754859\n"

} catch {
    print(error)
}