一群人告诉我,可编码比使用 swiftyjson 要好得多,所以我正在尝试一下。我想将这个 JSON 的回报,https://api.gdax.com/products/BTC-USD/book?level=2
转换为两个数组(一个用于要价,一个用于出价)。我还希望在单独的变量中显示续集的值。这就是我使用 swiftyjson 的方式。如何使用可编码完成此操作?我为此使用alamofire。
这是阿拉莫火的电话,但它非常简单且无关紧要。
Alamofire.request(url, method: .get).responseJSON {(response) in
switch response.result{
case .success(let value):
这是重要的代码:
let swiftyJson = JSON(value)
guard let sequenceNum = Int(swiftyJson["sequence"].stringValue) else {return}
let askOrders = swiftyJson["asks"].arrayValue
let bidOrders = swiftyJson["bids"].arrayValue
let askSideBook = askOrders.map({ (obj) -> (price:Double, size:Double, numOrders:Double) in
let orderArray = obj.arrayValue
let price = orderArray[0].doubleValue
let size = orderArray[1].doubleValue
let numOrders = orderArray[2].doubleValue
return (price:price, size:size, numOrders:numOrders)
})
let bidSideBook = bidOrders.map({ (obj) -> (price:Double, size:Double, numOrders:Double) in
let orderArray = obj.arrayValue
let price = orderArray[0].doubleValue
let size = orderArray[1].doubleValue
let numOrders = orderArray[2].doubleValue
return (price:price, size:size, numOrders:numOrders)
})
这是缩短的JSON,但它会让你了解一般格式。如您所见,第一个值是价格,第二个是大小,第三个是订单数量。价格和大小都以字符串形式返回,但我需要它们作为双精度返回。
{
"sequence": 4448910440,
"bids": [
[
"9679.96",
"9.52707734",
38
],
[
"9679.94",
"0.12631007",
3
],...
],
"asks": [
[
"9679.97",
"45.51632996",
10
],
[
"9679.98",
"1.31689466",
1
],...
]
}
我也听说过 https://github.com/Otbivnoe/CodableAlamofire。这是推荐的吗?
这是我到目前为止所拥有的,但我不知道如何按要价和出价数组中每个项目的索引来处理数组。
struct OrderBookItems: Codable {
let bidOrderBook: [DataPoints]
let askOrderBook: [DataPoints]
private enum CodingKeys: String, CodingKey {
case bidOrderBook = "bid"
case askOrderBook = "ask"
}
}
codingKeys
的值是错误的(复数形式),您需要第二个结构来提供自定义初始值设定项来解码数组
struct OrderBookItems: Decodable {
let bidOrderBook: [DataPoint]
let askOrderBook: [DataPoint]
private enum CodingKeys: String, CodingKey {
case bidOrderBook = "bids"
case askOrderBook = "asks"
}
}
struct DataPoint : Decodable {
let price : Double
let size : Double
let numOrders : Int
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
price = Double(try container.decode(String.self)) ?? 0.0
size = Double(try container.decode(String.self)) ?? 0.0
numOrders = try container.decode(Int.self)
}
}