微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – Codable / Decodable应该使用字符串解码数组

为什么名称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:

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] 举报,一经查实,本站将立刻删除。

相关推荐