Пытаюсь расшифровать JSON - PullRequest
0 голосов
/ 16 июня 2020

У меня есть это json Я получаю из API:

{
    "product_id": "id",
    "name": "name",
    "manufacturer": "manufacturer",
    "image_url": "url",
    "additional_info": "",
    "store_id": "id",
    "store_name": "name",
    "owner_id": "id",
    "quantities": [
        {
            "ml": 1,
            "price": 2
        },
        {
            "ml": 1,
            "price": 2
        },
        {
            "ml": 1,
            "price": 2
        },
        {
            "ml": 1,
            "price": 2
        }
    ]
}

Это модель, которая у меня есть:

struct Quantity: Codable {
    var ml: Int
    var price: Float

    enum CodingKeys : String, CodingKey {
        case ml = "ml"
        case price = "price"
    }
}

struct Product: Codable {
    let uuid: String
    let productName: String
    let productManufacturer: String
    let productImage: String
    let quantities: [Quantity]
    let additionalInfo: String?
    let storeID: String
    let storeName: String
    let ownerID: String

    enum CodingKeys : String, CodingKey {
        case uuid = "product_id"
        case productName = "name"
        case productManufacturer = "manufacturer"
        case productImage = "image_url"
        case quantities = "quantities"
        case additionalInfo = "additional_info"
        case storeID = "store_id"
        case storeName = "store_name"
        case ownerID = "owner_id"
    }
}

Я пытаюсь расшифровать это, но я получить эту ошибку:

Failed to decode json:  typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))

Вот как я декодирую JSON:

func fetchGenericData<T: Decodable>(request: URLRequest, completion: @escaping(T) -> ()) {
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        if let error = error {
            //TODO: Handle error.
            print(error)
            return
        }

        guard let data = data else { return }
        do {
            let object = try self.decoder.decode(T.self, from: data)
            completion(object)
        }catch let jsonError{
            print("Failed to decode json: ", jsonError)
        }
    }.resume()
}

Я понимаю ошибку, но не знаю, как ее исправить.

Я не знаю, что здесь не так, я подумал, может быть, Quantity, но мне кажется, что он должен его декодировать нормально, так же, как "product_id" имеет значение, поэтому каждый объект количества имеет это ключ и его ценность, это не похоже на словарь. Проблема даже в объекте Quantity?

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

Я предполагаю, что вы, кажется, пытаетесь расшифровать массив продуктов, но на самом деле он возвращает только словарь, содержащий только один продукт. Попробуйте этот код, который пытается расшифровать ваш JSON в единый продукт, и он должен решить проблему:

fetchGenericData(request: request) { (product: Product) in
    print(product)
}

Вместо того, что вы делаете прямо сейчас, что может выглядеть так:

fetchGenericData(request: request) { (products: [Product]) in
    print(product)
}
0 голосов
/ 16 июня 2020

Вы должны использовать try JSONDecoder().decode(Product.self, from: data)

Я думаю, вы пройдете [Product] .self

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