错误:"Expected to decode Dictionary<String, Any> but found an array instead." — 但我还没有定义字典?



我正在做一个创意项目,我正在尝试使用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://i.stack.imgur.com/MVtES.jpg

最后,这里是我捕获的完整错误:

typeMismatch (Swift.Dictionary<迅速。字符串,任意>Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String,>但是发现了一个数组。", underlyingError: nil))

我对这个错误的理解是,它说我告诉JSONDecoder()寻找<String,>的字典,但它在链接,只看到一个数组。我很困惑,因为我不知道它在哪里认为我提供了字典。我哪里搞砸了?不寻找具体的代码更改,只是一些指导我错过了什么。

Thanks in advance:)

正如您在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's关于在模型中将amount更改为Double而不是Int的有用评论。

相关内容

  • 没有找到相关文章

最新更新