我有这样的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"
的值 . 是否可以在不创建额外结构的情况下执行此操作?
这就是我现在所拥有的 . 我想避免添加另一个结构,因为我真正需要的唯一的东西是买入/买入和卖出/卖出的 Value .
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)")
}
1 回答
要直接回答您的问题,是的,很容易忽略
success
和message
键值对并直接转到results
.尽管如此,使用单个结构来解析这两个JSON响应会有点复杂 . 它们都有一个非常不同的结构,这将使两个不同的结构使用编码更容易 . 要突出一些差异:
buy
,sell
嵌套在results
中 .bids
,asks
不是 .键完全不同 .
buy
,sell
有一个键值对数组,而bids
,asks
simple有一个值数组 .可编码结构应该简单明了 . 最好有两个与每个响应相对应的 .