我有这样的JSON:
{
"success": true,
"message": "",
"result": {
"buy": [
{
"Quantity": 0.0056,
"Rate": 18527
},
{
"Quantity": 0.11431426,
"Rate": 18526
}
],
"sell":[
{
"Quantity": 8.20604116,
"Rate": 18540
},
{
"Quantity": 0.95600491,
"Rate": 18574.99999998
}
]
}
}
和另一组这样的JSON:
{
"lastUpdateId": 1027024,
"bids": [
[
"4.00000000", // PRICE
"431.00000000", // QTY
[] // Can be ignored
]
],
"asks": [
[
"4.00000200",
"12.00000000",
[]
]
]
}
使用可编码解析这两个响应的最佳方法是什么。它们都需要使用相同的结构进行解析,或者需要转换为相同的结构(无论何时更快地完成工作)。我不想为整个第一个响应创建一个结构,因为我不打算使用像"success"
和"message"
这样的键。我基本上想要忽略它们并直接获取"result"
密钥但是在第二个响应中,我将使用所有数据,因此我创建了一个名为TotalOrderBook
的结构。做这个的最好方式是什么?
令我感到困惑的是忽略了第一个JSON响应中的密钥"success"
和"message"
,并直接获得了密钥"result"
的值。是否可以在不创建额外结构的情况下执行此操作?
这就是我现在所拥有的。我想避免添加另一个结构,因为我真正需要的唯一的东西是买入/买入和卖出/卖出的价值。
struct TotalOrderBook:Codable{
var buy:[UniversalOrder]?
var sell:[UniversalOrder]?
var bid:[UniversalOrder]?
var ask:[UniversalOrder]?
var buyOrderBook: [UniversalOrder] {
return bid ?? buy ?? [UniversalOrder]()
}
var sellOrderBook: [UniversalOrder] {
return ask ?? sell ?? [UniversalOrder]()
}
var updatedTime:Date
}
struct UniversalOrder:Codable{
var price : Double {
return Double(rate ?? binPrice ?? 0)
}
var size : Double {
return Double(quantity ?? binQuantity ?? 0 )
}
//let numOrders : Int
var quantity:Double?
var rate:Double?
var binPrice:Double?
var binQuantity:Double?
private enum CodingKeys: String, CodingKey {
case rate = "Rate"
case quantity = "Quantity"
//case numOrders, binPrice,
}
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
binPrice = Double(try container.decode(String.self)) ?? nil
binQuantity = Double(try container.decode(String.self)) ?? nil
quantity = nil
rate = nil
}
}
这是我解码的方式:
let decoder = JSONDecoder()
let data = try! JSONSerialization.data(withJSONObject: value) //value is the response from Alamofire
var theWholeOrderBook:UniversalOrder!
do {
theWholeOrderBook = try decoder.decode(UniversalOrder.self, from: data)
} catch let error {
//print ("error is \(e) ** \(value)")
}
要直接回答你的问题,是的,很容易忽略success
和message
键值对并直接前往results
。
尽管如此,使用单个结构来解析这两个JSON响应会有点复杂。它们都有一个非常不同的结构,这将使两个不同的结构使用编码更容易。要突出一些差异:
buy
,sell
嵌套在results
内。 bids
,asks
不是。buy
,sell
有一系列键值对,而bids
,asks
simple有一系列值。可编码结构应该简单明了。最好有两个与每个响应相对应的。