У меня такой 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",
[]
]
]
}
Как лучше всего разобрать эти два ответа с помощью codable. Их необходимо проанализировать с использованием одной и той же структуры или преобразовать в одну и ту же структуру (что бы ни выполняло работу быстрее). Я не хочу создавать структуру для всего первого ответа, потому что я не собираюсь использовать такие ключи, как "success"
и "message"
. Я в основном хочу игнорировать их и перейти непосредственно к клавише "result"
. Но во втором ответе я буду использовать все данные, поэтому я создал для этого структуру с именем TotalOrderBook
. Как лучше всего это сделать?
Меня смущает игнорирование ключей "success"
и "message"
в первом ответе JSON и переход сразу к значению ключа "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)")
}
return bid ?? buy ?? []
, аcatch let error
является избыточным толькоcatch
- person Leo Dabus   schedule 19.12.2017