Предположим на входе имеется вот такого типа JSON:

				
					[
  {
    "ID": 33,
    "Name": "Тайяр",
    "Rub": 0,
    "Dol": 18212,
    "dtc": "06 Nov 21"
  },
  {
    "ID": 20,
    "Name": "ТУРАЛ",
    "Rub": 0,
    "Dol": 19133.13,
    "dtc": "06 Nov 21"
  }
]
				
			

Это Json строка, которая содержит массив объектов. Для декодирования такой строки в Swift надо заранее знать структуру объекта и описать его в коде именно как структуру, унаследованную от класса Codable.

				
					struct Balance: Codable {
    var ID: Int
    var Name: String
    var Rub: Decimal
    var Dol: Decimal
    var dtc: String
}
				
			

После этого массив объектов :

				
					    var arr = Array<Balance>()
				
			

заполняется просто одной строкой кода:

				
					 arr = JSONDecoder().decode(Array<Balance>.self, from: data)
				
			

Целиком класс будет выглядеть так:

				
					import Foundation

struct Balance: Codable {
    var ID: Int
    var Name: String
    var Rub: Decimal
    var Dol: Decimal
    var dtc: String
}

class Balances {
    
    var arr = Array<Balance>()
    
    init(_ data: Data) {
        let str = String(data: data, encoding: .utf8)!
        if(str.count > 0) {
            do{
                arr = try JSONDecoder().decode(Array<Balance>.self, from: data)
            }
            catch {
                print("Error parsing Balance: " + error.localizedDescription)
                print(str)
            }
        }
    }
}

				
			

Использовать такой класс очень удобно, просто вызывает конструктор класса.

				
					    override func viewDidLoad() {
        super.viewDidLoad()

        api.GetBalances() { data in
            DispatchQueue.main.async {
                self.bals = Balances(data)
                self.tableView.reloadData()
            }
        }
    }

				
			


А вот это не правильный парсинг

В данном фрагменте кода парсится простейший JSON следующего вида:

				
					[
  "777;SNTETH;1;1;1;1;usr1;@",
  "776;BTCUSDT;1;1;1;1;usr1;@",
  "774;ROSEUSDT;1;1;1;1;usr1;@"
]
				
			

Как видим, это просто массив строк и если ползоваться правильным способ, надо писать примерно так,

				
					struct Data: Codable {
    var str = ""
}

class Paras {
    var arr = [Para]()
    private var str = [String]()
    
    init(fromData: Data = Data()){

        str = try JSONDecoder().decode(Data.self, from: fromData)
        
        ... ... ...
				
			

Сравните, насколько много лишнего кода

				
					import Foundation

class Paras {
    var arr = [Para]()
    private var str = [String]()
    
    init(fromData: Data = Data()){

        let st = String(data: fromData, encoding: .utf8)!
        let ar = st.split(separator: ",")

        ar.forEach { element in
            let s = element.replacingOccurrences(of: "[", with: "")
                           .replacingOccurrences(of: "]", with: "")
                           .replacingOccurrences(of: "\"", with: "")
            str.append(s+"")

    ... ... ...

				
			
Правильный парсинг JSON на Swift
Tagged on:

Leave a Reply

Your email address will not be published. Required fields are marked *