- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下问题。我向 FatSecret API 发送请求以获取食物的详细信息。如果我解码一种普通食品,它会起作用,但如果我得到一种品牌食品,它就不起作用。
我的结构看起来像:
struct fatsecretFood : Decodable {
let food : Food
struct Food : Decodable {
let brand_name: String?
let food_id: String?
let food_name: String?
let food_type: String?
let food_url: String?
let servings : Servings
struct Servings : Decodable {
let serving : [Serving]
struct Serving : Decodable {
let serving_id: String?
let serving_description: String?
let serving_url: String?
let metric_serving_amount: String?
let metric_serving_unit: String?
let number_of_units: String?
let measurement_description: String?
let calories: String?
let carbohydrate: String?
let protein: String?
let fat: String?
let saturated_fat: String?
let polyunsaturated_fat: String?
let monounsaturated_fat: String?
let trans_fat: String?
let cholesterol: String?
let sodium: String?
let potassium: String?
let fiber: String?
let sugar: String?
let vitamin_a: String?
let vitamin_c: String?
let calcium: String?
let iron: String?
}
}
}
}
出现错误的代码行:
let data = Data(requestResponse.utf8)
var foodDetails: fatsecretFood!
var errors: fatsecretError!
do {
let result = try JSONDecoder().decode(fatsecretFood.self, from: data)
foodDetails = result
} catch { print(error) }
return foodDetails!
在返回时我得到错误:
typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "food", intValue: nil), CodingKeys(stringValue: "servings", intValue: nil), CodingKeys(stringValue: "serving", intValue: nil)], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
示例通用食品(有效)的 JSON 如下所示:
{
"food": {
"food_id": "38884",
"food_name": "Chocolate Chip Cookies (Soft Type)",
"food_type": "Generic",
"food_url": "https://www.fatsecret.com/calories-nutrition/usda/chocolate-chip-cookies-(soft-type)",
"servings": {
"serving": [
{
"calcium": "0",
"calories": "130",
"carbohydrate": "16.75",
"cholesterol": "0",
"fat": "6.89",
"fiber": "0.9",
"iron": "4",
"measurement_description": "oz",
"metric_serving_amount": "28.350",
"metric_serving_unit": "g",
"monounsaturated_fat": "3.695",
"number_of_units": "1.000",
"polyunsaturated_fat": "0.992",
"potassium": "26",
"protein": "0.99",
"saturated_fat": "2.101",
"serving_description": "1 oz",
"serving_id": "38785",
"serving_url": "https://www.fatsecret.com/calories-nutrition/usda/chocolate-chip-cookies-(soft-type)?portionid=38785&portionamount=1.000",
"sodium": "92",
"vitamin_a": "0",
"vitamin_c": "0"
},
{
"calcium": "0",
"calories": "69",
"carbohydrate": "8.86",
"cholesterol": "0",
"fat": "3.64",
"fiber": "0.5",
"iron": "2",
"measurement_description": "cookie",
"metric_serving_amount": "15.000",
"metric_serving_unit": "g",
"monounsaturated_fat": "1.955",
"number_of_units": "1.000",
"polyunsaturated_fat": "0.525",
"potassium": "14",
"protein": "0.52",
"saturated_fat": "1.112",
"serving_description": "1 cookie",
"serving_id": "38786",
"serving_url": "https://www.fatsecret.com/calories-nutrition/usda/chocolate-chip-cookies-(soft-type)?portionid=38786&portionamount=1.000",
"sodium": "49",
"vitamin_a": "0",
"vitamin_c": "0"
},
{
"calcium": "2",
"calories": "458",
"carbohydrate": "59.10",
"cholesterol": "0",
"fat": "24.30",
"fiber": "3.2",
"iron": "13",
"measurement_description": "g",
"metric_serving_amount": "100.000",
"metric_serving_unit": "g",
"monounsaturated_fat": "13.034",
"number_of_units": "100.000",
"polyunsaturated_fat": "3.500",
"potassium": "93",
"protein": "3.50",
"saturated_fat": "7.411",
"serving_description": "100 g",
"serving_id": "61615",
"serving_url": "https://www.fatsecret.com/calories-nutrition/usda/chocolate-chip-cookies-(soft-type)?portionid=61615&portionamount=100.000",
"sodium": "326",
"vitamin_a": "0",
"vitamin_c": "0"
}
]
}
}
}
示例品牌食品的 JSON(不起作用)如下所示:
{
"food": {
"brand_name": "Pepperidge Farm",
"food_id": "61348",
"food_name": "Soft Baked Sugar Cookies",
"food_type": "Brand",
"food_url": "https://www.fatsecret.com/calories-nutrition/pepperidge-farm/soft-baked-sugar-cookies",
"servings": {
"serving": {
"calcium": "0",
"calories": "140",
"carbohydrate": "22",
"cholesterol": "10",
"fat": "5",
"fiber": "0",
"iron": "4",
"measurement_description": "serving",
"metric_serving_amount": "31.000",
"metric_serving_unit": "g",
"monounsaturated_fat": "1.5",
"number_of_units": "1.000",
"polyunsaturated_fat": "0.5",
"protein": "2",
"saturated_fat": "2.5",
"serving_description": "1 cookie",
"serving_id": "103910",
"serving_url": "https://www.fatsecret.com/calories-nutrition/pepperidge-farm/soft-baked-sugar-cookies",
"sodium": "90",
"sugar": "11",
"trans_fat": "0",
"vitamin_a": "0",
"vitamin_c": "0"
}
}
}
}
我没有找到错误。有人可以帮我吗?谢谢
最佳答案
请学会理解错误信息,它很容易阅读
typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "food", intValue: nil), CodingKeys(stringValue: "servings", intValue: nil), CodingKeys(stringValue: "serving", intValue: nil)], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil))
typeMismatch
表示您声明了错误的类型 ( Swift.Array<Any>
)。codingPath
数组表示受影响位置的关键路径 food/servings/serving
.debugDescription
的预期 部分描述你的错误(数组) found 部分描述了实际类型(字典,它是 Codable
方面的结构)。为了能够解码数组和字典类型,您必须添加自定义初始化程序。 serving
的最终类型始终是一个数组。
struct Servings : Decodable {
let serving : [Serving]
private enum CodingKeys : String, CodingKey { case serving }
init(from decoder : Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
let servingDictionary = try container.decode(Serving.self, forKey: .serving)
serving = [servingDictionary]
} catch DecodingError.typeMismatch {
serving = try container.decode([Serving].self, forKey: .serving)
}
}
}
注意事项:
.convertFromSnakeCase
策略并声明 camelCased 名称。Serving
对象总是发送所有键。关于json - Swift JSOn 解码错误 : Expected to decode Array<Any> but found a dictionary instead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57818665/
有没有办法在 .swift 文件(编译成 .swift 模块)中声明函数,如下所示: 你好.swift func hello_world() { println("hello world")
我正在尝试使用 xmpp_messenger_ios 和 XMPPFramework 在 iOS 上执行 MUC 这是加入房间的代码。 func createOrJoinRoomOnXMPP()
我想在我的应用程序上创建一个 3D Touch 快捷方式,我已经完成了有关快捷方式本身的所有操作,它显示正确,带有文本和图标。 当我运行这个快捷方式时,我的应用程序崩溃了,因为 AppDelegate
我的代码如下: let assetTag = Expression("asset_tag") let query2 = mdm.select(mdm[assetTag],os, mac, lastRe
我的 swift 代码如下所示 Family.arrayTuple:[(String,String)]? = [] Family.arrayTupleStorage:String? Family.ar
这是我的 JSON,当我读取 ord 和 uniq 数据时出现错误 let response2 : [String: Any] = ["Response":["status":"SUCCESS","
我想将 swift 扩展文件移动到 swift 包中。但是,将文件移动到 swift 包后,我遇到了这种错误: "Type 'NSAttributedString' has no member 'ma
使用CocoaPods,我们可以设置以下配置: pod 'SourceModel', :configurations => ['Debug'] 有什么方法可以用 Swift Package Manag
我正在 Xcode 中开发一个 swift 项目。我将其称为主要项目。我大部分都在工作。我在日期选择器、日期范围和日期数学方面遇到了麻烦,因此我开始了另一个名为 StarEndDate 的项目,其中只
这是 ObjectiveC 代码: CCSprite *progress = [CCSprite spriteWithImageNamed:@"progress.png"]; mProgressBar
我正在创建一个命令行工具,在 Xcode 中使用 Swift。我想使用一个类似于 grunt 的配置文件确实如此,但我希望它是像 Swift 包管理器的 package.swift 文件那样的快速代码
我假设这意味着使用系统上安装的任何 swift 运行脚本:#!/usr/bin/swift 如何指定脚本适用的解释器版本? 最佳答案 Cato可用于此: #!/usr/bin/env cato 1.2
代码说完全没问题,没有错误,但是当我去运行模拟器的时候,会出现这样的字样: (Swift.LazyMapCollection (_base:[ ] 我正在尝试创建一个显示报价的报价应用。 这是导入
是否可以在运行 Swift(例如 Perfect、Vapor、Kitura 等)的服务器上使用 RealmSwift 并使用它来存储数据? (我正在考虑尝试将其作为另一种解决方案的替代方案,例如 no
我刚开始学习编程,正在尝试完成 Swift 编程书中的实验。 它要求““编写一个函数,通过比较两个 Rank 值的原始值来比较它们。” enum Rank: Int { case Ace = 1 ca
在您将此问题标记为重复之前,我检查了 this question 它对我不起作用。 如何修复这个错误: error: SWIFT_VERSION '5.0' is unsupported, suppo
从 Xcode 9.3 开始,我在我的模型中使用“Swift.ImplicitlyUnwrappedOptional.some”包裹了我的字符串变量 我不知道这是怎么发生的,但它毁了我的应用程序! 我
这个问题在这里已经有了答案: How to include .swift file from other .swift file in an immediate mode? (2 个答案) 关闭 6
我正在使用 Swift Package Manager 创建一个应用程序,我需要知道构建项目的配置,即 Debug 或 Release。我试图避免使用 .xcodeproj 文件。请有人让我知道这是否
有一个带有函数定义的文件bar.swift: func bar() { println("bar") } 以及一个以立即模式运行的脚本foo.swift: #!/usr/bin/xcrun s
我是一名优秀的程序员,十分优秀!