为什么名称Array不能解码? 准备好游乐场,简单地将它粘贴到你的操场上 import Foundationstruct Country : Decodable { enum CodingKeys : String, CodingKey { case names } var names : [String]?}extension Country { public
准备好游乐场,简单地将它粘贴到你的操场上
import Foundation struct Country : Decodable { enum CodingKeys : String, CodingKey { case names } var names : [String]? } extension Country { public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) names = try values.decode([String]?.self, forKey: .names)! } } let json = """ [{ "names": [ "Andorre", "Andorra", "アンドラ" ] },{ "names": [ "United Arab Emirates", "Vereinigte Arabische Emirate", "Émirats Arabes Unis", "Emiratos Árabes Unidos", "アラブ首長国連邦", "Verenigde Arabische Emiraten" ] }] """.data(using: .utf8)! let decoder = JSONDecoder() do { let countries = try decoder.decode([Country].self, from: json) countries.forEach { print($0) } } catch { print("error") }您已将名称定义为Country的可选属性.
如果您的意图是该密钥可能不存在于JSON中
然后使用decodeIfPresent:
extension Country { public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) names = try values.decodeIfPresent([String].self, forKey: .names) } }
如果容器没有与key关联的值,或者值为null,则此方法返回nil.
但实际上你可以省略你的自定义init(来自解码器:解码器)
实现(和枚举CodingKeys),因为这是默认行为而且会
自动合成.
备注:在任何catch子句中定义了隐式变量错误,
所以
} catch { print(error.localizedDescription) }
可以提供更多信息,而不仅仅是一个打印(“错误”)(虽然不是在这个特殊的情况下).