Why is the names Array not decoding?
Prepared for Playground, Simple paste this into your playground
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")
}
                You have defined names as an optional property of Country.
If your intention is that this key may not be present in the JSON
then use 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)
    }
}
This method returns nil if the container does not have a value associated with key, or if the value is null.
But actually you can just omit your custom init(from decoder: Decoder)
implementation (and the enum CodingKeys), because that is the default behaviour and will
be synthesized automatically.
Remark: An implicit variable error is defined in any catch clause,
so
} catch {
    print(error.localizedDescription)
}
can be more informative than just a print("error") (although not
in this particular case).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With