提问者:小点点

努力解码JSON


我有一个从API获得的json:

{
    "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个答案

匿名用户

我的猜测是,您似乎试图解码一个产品数组,但实际上它只返回一个字典,其中只包含一个产品。 尝试以下代码,它尝试将JSON解码为单个产品,它应该可以解决这个问题:

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

而不是你现在正在做的事情,可能是这样的:

fetchGenericData(request: request) { (products: [Product]) in
    print(product)
}

匿名用户

您应该使用尝试JSONDecoder()。decode(product.self,from:data)

我认为你通过了[产品]。自我