/ / Проблем с използване на JSON декодиране за Swift 4 Xcode - xcode, swift4, jsondecoder

Проблем с използване на JSON декодиране за Swift 4 Xcode - xcode, swift4, jsondecoder

Имам проблем тук ... Използвам API на WooCommerce, за да получа данни от базата данни ... Всичко е страхотно с този код, но имам странен проблем с получаването на Featured photo (Featured_src), Featured photo Value е String, когато изображението на продукта съществува, но когато някога няма изображение за продукта, получавам стойност bool вместо низ (получавам невярно). И приложението се срива. Както виждате в моя код, аз определям свойствата като String или int или .... и задавам Featured_src като низ, но понякога получавам стойност bool за него. Как трябва да редактирам кода си?

import UIKit

struct Products: Decodable {
let products: [product]
}

struct product: Decodable {

let title: String
let id: Int
let price: String
let sale_price: String?
let featured_src: String?
let short_description: String
}


class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let jsonUrlString = "https://www.komeil24.com/wc-api/v3/products"

guard let url = URL(string: jsonUrlString) else {return}

URLSession.shared.dataTask(with: url) { (data, response, error) in

guard let data = data else {return}

do {

let products = try JSONDecoder().decode(Products.self, from: data)
print(products.products)

} catch let jsonErr {

print("Error" , jsonErr)
}

}.resume()

}

}

Отговори:

0 за отговор № 1

Сървърът кодира това ужасно. Но като разработчици трябва да работим с това, което ни се дава. Ще трябва да декодирате Product ръчно. Също така мисля feature_src е по-близо до a URL? вместо a String? (можете да промените това, ако искате).

Ключовото извличане тук е вместо да се използва try decoder.decode(URL.self, ...) и получите грешка, ако ключът не съдържа a URL, ти използваш try? decoder.decode(URL.self, ...) и получи nil.

struct Product: Decodable {
let title: String
let id: Int
let price: String
let salePrice: String?
let featuredSource: URL?
let shortDescription: String

private enum CodingKeys: String, CodingKey {
case title, id, price
case salePrice = "sale_price"
case featuredSource = "featured_src"
case shortDescription = "short_description"
}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

// Nothing special here, just typical manual decoding
title            = try container.decode(String.self, forKey: .title)
id               = try container.decode(Int.self, forKey: .id)
price            = try container.decode(String.self, forKey: .price)
salePrice        = try container.decodeIfPresent(String.self, forKey: .salePrice)
shortDescription = try container.decode(String.self, forKey: .shortDescription)

// Notice that we use try? instead of try
featuredSource   = try? container.decode(URL.self, forKey: .featuredSource)
}
}