is this a nested json?
request format: GET /trading-pairs
:
[
{
"name": "ETH-KRW",
"baseAsset": "ETH",
"quoteAsset": "KRW"
}, {
"name": "BTC-KRW",
"baseAsset": "BTC",
"quoteAsset": "KRW"
}, {
"name": "BCH-KRW",
"baseAsset": "BCH",
"quoteAsset": "KRW"
}
]
and then :
request format : GET /trading-pairs/{name}/ticker
:
{
"price": 10194500,
"ask": 10195000,
"bid": 10184500,
"volume": 1752.05558316,
"time": "2018-03-14T03:50:41.184Z"
}
I have been trying to parse json data in this format but result is unsuccessful so far
how would it possible to parse data in such format?
Coders, devs, lets parse this json format.. . :)
===============What I Tried=============
-
Response Models:
import Foundation
// MARK: - TradingPair
@objcMembers class TradingPair: NSObject, Codable {
var id: Int
var name, baseAsset: String
var quoteAsset: String
//var pairs: TickerByPairs?
init(id: Int, name: String, baseAsset: String, quoteAsset: String) {
self.id = id
self.name = name
self.baseAsset = baseAsset
self.quoteAsset = quoteAsset
}
}
import Foundation
// MARK: - TickerByPairs
@objcMembers class TickerByPairs: NSObject, Codable {
var price, ask: Float
var askVolume: Double
var bid: Float
var bidVolume, volume: Double
var time: String
init(price: Float, ask: Float, askVolume: Double, bid: Float, bidVolume: Double, volume: Double, time: String) {
self.price = price
self.ask = ask
self.askVolume = askVolume
self.bid = bid
self.bidVolume = bidVolume
self.volume = volume
self.time = time
}
}
2. API request func s:
import Foundation
import Alamofire
import SwiftyJSON
import PromiseKit
import JSONDecoder_Keypath
class ServerCommunicator {
// using this: `static var tradingPairs: String {
return serverEndPoint + "/trading-pairs"`
}
static func getTradingPairs() -> Promise<[TradingPair]> {
return Promise { seal in
AF.request(API.tradingPairs, method: .get).validate().responseData { (data) in
guard let data = data.value else {
let err: Error = Error.self as! Error
seal.reject(err)
return
}
guard let tradingPairs = try? JSONDecoder().decode([TradingPair].self, from: data) else {
let err: Error = Error.self as! Error
seal.reject(err)
return
}
//dump(tradingPairs)
dump(tradingPairs)
seal.fulfill(tradingPairs)
}
}
}
// using this: static func getPairByTicker(pairName: String) -> String { return tradingPairs + "/\(pairName)" + "/ticker" }
static func getPairByTicker(pairName: String = "") -> Promise<TickerByPairs> {
let decoder = JSONDecoder()
return Promise { seal in
AF.request(API.getPairByTicker(pairName: pairName), method: .get).responseDecodable(of: TickerByPairs.self, decoder: decoder) { response in
// dump(response.value)
switch response.result {
case .success(let suc):
return seal.fulfill(suc)
case .failure(let err):
return seal.reject(err)
}
}
}
}
}
3. ViewController class:
import UIKit
import Alamofire
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var tradingPair: [TradingPair]?
var tickerByPair:[TickerByPairs]?
override func viewDidLoad() {
super.viewDidLoad()
getTradingPairs()
}
func refresh(data: [TradingPair]) {
self.tradingPair = data
self.tableView.reloadData()
}
func getTradingPairs() {
print("api call")
ServerCommunicator.getTradingPairs().done{ response_1 -> Void in
print(response_1)
for keypathValue in response_1 {
ServerCommunicator.getPairByTicker(pairName: keypathValue.name).done{ response_2 -> Void in
print(response_2)
}.catch{(err) in
print(err)
}
}
}.catch{(err) in
print(err)
}
}
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let data = self.tradingPair else {
print("data is empty")
return 0
}
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TradingPairCell") as! TradingPairCell
guard let data = self.tradingPair else {
print("again empty")
return cell
}
let price = self.tickerByPair![indexPath.row].price
let volume = self.tickerByPair![indexPath.row].volume
cell.price.text = String(describing: price)
cell.volume.text = String(describing: volume)
cell.configure(data: data[indexPath.row])
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 44
}
}
1. Cell Class
class TradingPairCell: UITableViewCell {
@IBOutlet weak var name: UILabel!
@IBOutlet weak var price: UILabel!
@IBOutlet weak var volume: UILabel!
//var pairByTicker: PairByTicker?
func configure(data: TradingPair) {
self.name.text = data.name
// self.price.text = data.baseAsset
// self.volume.text = data.quoteAsset
}
}
II. This is what i get in console:
api call
data is empty
data is empty
=====Response_1=====[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0>,[<Test.TradingPair: 0x600003521cc0> .. .. .
=====Response_2=====<Test.TickerByPairs: 0x600000c78640>=====Response_2=====
=====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2=====
=====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2=====
=====Response_2=====<GoPaxTest.TickerByPairs: 0x600000c78640>=====Response_2=====.. .. .. .. ..