"Ожидается декодирование словаря но вместо этого нашел массив. ", lowerError: nil - PullRequest
0 голосов
/ 17 июня 2020

Различные ответы api, не обрабатываемые кодом. Нужно проанализировать массив, но мой код ожидает словарь, я не понимаю, где его изменить. Пожалуйста, направьте. Ниже приведен код:

func fetchProducts() {
    print("Page no\(String(describing: filter.page) )")

    NetworkHelper().makeAPIRequest(forAPI: .getProducts(forProduct: filter), responseType: ProductsDescription.self) { [weak self] (result) in

        guard let `self` = self else { return }
        switch result{
        case .error(let error):
            self.delegate?.ProductListing(self, didGetError: error)
        case .success(let response,let responseMsg):
            print("success")
            guard let resp = response,let products = response?.data else {
                return
            }
            if self.filter.page == 1 {
                self.products = []
            }
                if products.count > 0 {
                    self.products.append(contentsOf: products)
                    self.filter.page? += 1
                }
            self.delegate?.ProductListing(self, didSuccessProductListingDataWithMsg: nil)
            self.isInProgress = false
        }
    }
}

// Обновлено:

class ProductsDescription: Codable {
var data: [Product]?

enum CodingKeys: String, CodingKey {
    case data
}

required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let dataJSON = try values.decodeIfPresent(JSONModel.self, forKey: .data)

            if let productsData = try dataJSON?.rawData() {
                self.data = try JSONDecoder().decode([Product].self, from: productsData)
            }

        }
}

Ответ API:

{
"page" : "1",
"data" : [
{
  "options" : [
    {
      "value" : "Black berries",
      "key" : 128
    }
  ],
  "product_name" : "Fresh",
  "old_price" : "$10.00",
  "prodt_name" : "Exotic Fruits",
  "is_favorite" : 1,
  "product_rating" : 0,
  "product_id" : "13",
  "user_id" : "135",
  "brand_id" : "126",
  "selprod_id" : "128",
  "product_veg_status" : "1",
  "user_name" : "raj yadav",
  "product_price" : "$10.00",
  "prodcat_id" : "211",
  "discounted_price" : "-0% Off",
  "product_name" : "Black berries",
  "special_price_found" : "0",
  "selprod_stock" : "1000",
  "selprod_min_order_qty" : "1",
  "product_model" : "b44"
},

Ошибка:

typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil)) 

В короткая проблема, когда ответ приходит следующим образом:

  "data" : [ 
            {

Если так, все работает нормально:

 "data": { 
          "products": [ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...