为什么名称Array不能解码?
准备好游乐场,简单地将它粘贴到你的操场上
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:
如果您的意图是该密钥可能不存在于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) }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。