Ios 正在努力解码JSON

Ios 正在努力解码JSON,ios,json,swift,Ios,Json,Swift,我有一个从API获得的json: { "product_id": "id", "name": "name", "manufacturer": "manufacturer", "image_url": "url", "additional_info": "", "store_id": "id", "store_name": "name", "owner_id": "id", "quantities": [ {

我有一个从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:typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“应解码数组,但找到字典。”,underlineerror: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()
}
func fetchGenericData(请求:URLRequest,完成:@escaping(T)->()){
URLSession.shared.dataTask(带:请求){(数据、响应、错误)在
如果let error=error{
//TODO:处理错误。
打印(错误)
返回
}
guard let data=data else{return}
做{
让object=try self.decoder.decode(T.self,from:data)
完成(目标)
}接住让杰森罗{
打印(“未能解码json:,jsonError”)
}
}1.简历()
}
我理解这个错误,但我不知道如何修复它

我不知道这里出了什么问题,我想可能是
数量
,但是,对我来说,它看起来应该解码得很好,就像“product\u id”有值一样,所以每个数量对象都有它的键和值,这在我看来不像字典。
问题是否存在于Quantity对象中?

我猜您似乎试图解码产品数组,但实际上它只返回一个只包含一个产品的字典。尝试将您的
JSON
解码为单个产品的代码,它将解决此问题:

fetchGenericData(request: request) { (product: Product) in
    print(product)
}
而不是你现在可能正在做的事情,看起来像这样:

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

您应该使用
try JSONDecoder().decode(Product.self,from:data)


我认为您通过了[Product].self,这与您的问题无关,但如果与密钥名称匹配,则无需定义编码密钥
case ml,price
Enough在这种情况下如何调用fetchGenericData?如果我在我的游乐场中直接使用您的代码并解码它,而不使用该函数,则一切正常,因此您对该函数的调用肯定是错误的。@JoakimDanielson谢谢您。我也只是看了看,服务器端代码上有一个简单的错误,我没有注意到。所以你接受的答案与你的问题解决方案无关?谢谢,我完全忘记了服务器端代码xP。那里有一个简单的问题。哦,你是说有一些代码包装了产品字典?实际上,我把一些东西包装在一个数组中,由于我做了一个更改而导致了一个错误,我完全忘记了它,它返回了一个错误。我只记得在阅读了你们的评论(以及对我的问题的评论)后才去看邮递员,我发现我得到了一个错误,而不是我想要的JSON。