Всем привет ! Вопрос :
Мне приходит json вида:
{"ok":"True","product":[{"desc":"diet","name":"cola","nfc_id":"B000000001","status":"1","uhf_id":"A000000001"}]}
Через jsoncafe.com сгенерировал два файла :
// ProductDetailProduct.swift
// Created by z on 01/07/2019.
// Copyright © 2019 . All rights reserved.
// ProductDetailProduct.swift
// Model Generated using
// Created on June 30, 2019
import Foundation
struct ProductDetailProduct : Codable {
let desc : String?
let name : String?
let nfcId : String?
let status : String?
let uhfId : String?
enum CodingKeys: String, CodingKey {
case desc = "desc"
case name = "name"
case nfcId = "nfc_id"
case status = "status"
case uhfId = "uhf_id"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
desc = try values.decodeIfPresent(String.self, forKey: .desc)
name = try values.decodeIfPresent(String.self, forKey: .name)
nfcId = try values.decodeIfPresent(String.self, forKey: .nfcId)
status = try values.decodeIfPresent(String.self, forKey: .status)
uhfId = try values.decodeIfPresent(String.self, forKey: .uhfId)
}
}
//
// ProductDetailFromBack.swift
//
// Created by z on 01/07/2019.
// Copyright © 2019 . All rights reserved.
//
//
// ProductDetailFromBack.swift
// Model Generated using
// Created on June 30, 2019
import Foundation
struct ProductDetailFromBack : Codable {
let ok : Bool?
let product : [ProductDetailProduct]?
enum CodingKeys: String, CodingKey {
case ok = "ok"
case product = "product"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
ok = try values.decodeIfPresent(Bool.self, forKey: .ok)
product = try values.decodeIfPresent([ProductDetailProduct].self, forKey: .product)
}
}
и вот такой функцией вызываю из своего контроллера ( в методе viewDidLoad ) в блоке do-catch (где комментарий try over codable)
func getProductDetailFromBack() {
guard let urlPay = URL(string: "http://переименовал/api/v1.0/products/nfc_id/B000000001") else { return }
let session = URLSession.shared
session.dataTask(with: urlPay) { (data, response, error) in
if let response = response {
// print(response)
}
guard let data = data else { return }
print("-----")
print(data) //bytes
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
} catch {
print(error)
}
// try over codable
do {
// data we are getting from network request
let decoder = JSONDecoder()
let response = try decoder.decode(ProductDetailProduct.self, from: data)
print(response)
} catch { print(error) }
// try over swiftyJSON
let jsonH = "{ \"people\": [{ \"firstName\": \"Paul\", \"lastName\": \"Hudson\", \"isAlive\": true }, { \"firstName\": \"Angela\", \"lastName\": \"Merkel\", \"isAlive\": true }, { \"firstName\": \"George\", \"lastName\": \"Washington\", \"isAlive\": false } ] }"
if let data = jsonH.data(using: .utf8) {
if let json = try? JSON(data: data) {
for item in json["people"].arrayValue {
print(item["firstName"].stringValue)
}
}
}
}.resume()
}
Но print(response) выдает nil’ы
Также в проект установил SwiftyJSON - если через него это сделать проще то будет круто )
Подскажите пожалуйста, как по простому мне выудить переменные с которыми буду работать из json? Сейчас пришла идея что мне во втором файле (ProductDetailFromBack) как раз и идёт декодирование json? И мне как-то следует переиспользовать это при вызове со своего вьюконтроллера?
Спасибо