对Swift 4 Xcode使用JSON解码存在问题

对Swift 4 Xcode使用JSON解码存在问题,xcode,swift4,jsondecoder,Xcode,Swift4,Jsondecoder,我这里有个问题。。。我正在使用WooCommerceAPI从数据库获取数据。。。这段代码一切都很好,但是我在获取特色照片(Featured_src)时遇到了一个奇怪的问题,当产品的图像存在时,特色照片值是一个字符串,但是当产品没有图像时,我会得到一个bool值而不是字符串(我得到一个false)。应用程序崩溃了。正如您在代码中看到的,我将属性指定为String、int或。。。。我将characterized_src设置为string,但有时会得到bool值。我应该如何编辑我的代码 import

我这里有个问题。。。我正在使用WooCommerceAPI从数据库获取数据。。。这段代码一切都很好,但是我在获取特色照片(Featured_src)时遇到了一个奇怪的问题,当产品的图像存在时,特色照片值是一个字符串,但是当产品没有图像时,我会得到一个bool值而不是字符串(我得到一个false)。应用程序崩溃了。正如您在代码中看到的,我将属性指定为String、int或。。。。我将characterized_src设置为string,但有时会得到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()

}

}

服务器对此进行了编码。但是作为开发人员,我们必须使用我们所得到的。您必须手动解码
产品
。另外,我认为
feature\u src
更接近于
URL?
,而不是
字符串?
(如果需要,可以更改)

这里的密钥外卖不是使用
try decoder.decode(URL.self,…)
,如果密钥不包含
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)
    }
}

你必须写一个自定义的初始值设定项来有条件地处理这个案例。需要用正确的句子进行更多的澄清。