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)
}

可以提供更多信息,而不仅仅是一个打印(“错误”)(虽然不是
在这个特殊的情况下).

点赞