我有一个从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对象都有它的键和它的值,这对我来说不像是字典。 问题是不是连在数量对象上?
我的猜测是,您似乎试图解码一个产品数组,但实际上它只返回一个字典,其中只包含一个产品。 尝试以下代码,它尝试将JSON
解码为单个产品,它应该可以解决这个问题:
fetchGenericData(request: request) { (product: Product) in
print(product)
}
而不是你现在正在做的事情,可能是这样的:
fetchGenericData(request: request) { (products: [Product]) in
print(product)
}
您应该使用尝试JSONDecoder()。decode(product.self,from:data)
我认为你通过了[产品]。自我