我试图了解 Apple 添加的新 Codable 功能,但我无法解决这个问题。我有一个像这样的 json 输出
{
"Afpak": {
"id": 1,
"race": "hybrid",
"flavors": [
"Earthy",
"Chemical",
"Pine"
],
"effects": {
"positive": [
"Relaxed",
"Hungry",
"Happy",
"Sleepy"
],
"negative": [
"Dizzy"
],
"medical": [
"Depression",
"Insomnia",
"Pain",
"Stress",
"Lack of Appetite"
]
}
}
}
我有一个结构就像
struct Strain: Codable {
var name: String
var id: Int
var race: String
var flavors: [String]
var effects: [String: [String]]
}
所以显然它会失败,因为我的 json 中没有 name 键。名字应该是“Afpak”,我环顾四周,但大多数教程没有给出任何关于如何解决这个问题的例子,他们只是做了[String:Strain]
这不是我需要的。反正有没有将我的字典的键设置为我的 name 变量?
您可以使用一个小技巧来解决未知的关键问题:为您的Strain
结构创建一个辅助结构,制作该辅助结构Codable
,将响应解码为[String:Helper]
,然后创建一个带有 2 个输入参数、应变名称和Helper
实例。
通过这种方式,您可以将 存储name
为 的属性,Strain
并且不需要过于复杂的解码来规避未知顶级Dictionary
密钥的问题。
struct Strain {
var name: String
var id: Int
var race: String
var flavors: [String]
var effects: [String: [String]]
init(from helper: StrainHelper, with name:String){
self.name = name
self.id = helper.id
self.race = helper.race
self.flavors = helper.flavors
self.effects = helper.effects
}
}
struct StrainHelper: Codable {
var id: Int
var race: String
var flavors: [String]
var effects: [String: [String]]
}
do {
let strainHelper = try JSONDecoder().decode([String:StrainHelper].self, from: data)
guard let strainName = strainHelper.keys.first else {throw NSError(domain: "No key in dictionary",code: 404)}
let strain = Strain(from: strainHelper[strainName]!, with: strainName)
} catch {
print(error)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句