Получить переменные из json

swift
xcode
ios

#1

Всем привет ! Вопрос :
Мне приходит 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? И мне как-то следует переиспользовать это при вызове со своего вьюконтроллера?
Спасибо


#2

А почему у вас входная модель передается ProductDetailProduct, а не ProductDetailFromBack ?


#3

Спасибо, чуть лучше понял суть.
Разбираюсь дальше , пробую сгенерировать модели через другой генератор , тут чуть запутался )


#4

Посмотрите еще в сторону ObjectMapper