但找到了一个数组。”——但我还没有定义字典?,swift,jsondecoder,spoonacular"/>

首页 > 解决方案 > 错误:“需要解码字典但找到了一个数组。”——但我还没有定义字典?

问题描述

我正在从事一个创意项目,我正在尝试使用 Swift 的 JSONDecoder() 函数从 API 数据库中解码内容。我已经构建了我的结构,一个 getData() 函数,并且我已经为 JSONDecoder() 函数设置了一个 do-try-catch。我很难理解我正在做什么来得到我得到的错误。

这是我的结构:

struct Response: Codable {
    let foundRecipes: [Recipe]
    let foundIngredients: [Ingredient]
}

struct Recipe: Codable {
    let id: Int
    let title: String
    let image: String
    let imageType: String
    let usedIngredientCount: Int
    let missedIngredientCount: Int
    let missedIngredients: [Ingredient]
    let usedIngredients: [Ingredient]
    let unusedIngredients: [Ingredient]
    let likes: Int
}

struct Ingredient: Codable {
    let id: Int
    let amount: Int
    let unit: String
    let unitLong: String
    let unitShort: String
    let aisle: String
    let name: String
    let original: String
    let originalString: String
    let origianalName: String
    let metaInformation: [String]
    let meta: [String]
    let image: String
}

这是我的 getData() 函数:

    func getData(from url: String) {
    URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
        guard let data = data, error == nil else {
            print("something went wrong.")
            return
        }
        var result: Response?
        do {
            result = try JSONDecoder().decode(Response.self, from: data)
        }
        catch {
            print("")
            print(String(describing: error)) // Right here is where the error hits.
        }
        
        guard let json = result else {
            return
        }
        print(json.foundRecipes)
    }).resume()
}

这是 API 文档的链接。我在 getData() 中调用的 URL 链接到相同的搜索结构,如他们的示例所示:https ://spoonacular.com/food-api/docs#Search-Recipes-by-Ingredients - 这是我正在处理的确切搜索的 url 结果:https ://imgur.com/a/K3Rn9SZ

最后,这是我发现的完整错误:

typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解码 Dictionary<String, Any> 但找到了一个数组。", 基础错误: nil))

我对这个错误的理解是,它是说我告诉 JSONDecoder() 查找 <String, Any> 的字典,但它在链接中并且只看到一个数组。我很困惑,因为我不知道它认为我在哪里提供字典。我在哪里搞砸了?不是在寻找特定的代码更改,只是对我所缺少的东西的一些指导。

提前致谢 :)

标签: swiftjsondecoderspoonacular

解决方案


正如您在 API 数据图像和链接到的 API 文档中看到的那样,API 正在返回一个数组(例如,在文档中,您可以看到它被 包围[...])。实际上,看起来 API 返回了一个Recipe.

因此,您可以将解码调用更改为:

var result: [Recipe]?
do {
   result = try JSONDecoder().decode([Recipe].self, from: data)
   print(result)
} catch {
  print(error)
}

也许您的想法Response来自其他地方,但密钥foundRecipesfoundIngredients没有出现在这个特定的 API 调用中。


另外,感谢@workingdog 对在模型中更改amount为 aDouble而不是 an的有用评论Int


推荐阅读