2017-07-10 3 views
3

名前配列がデコードされないのはなぜですか?コード可能/デコード可能な文字列で配列をデコードする必要があります

あなたはCountryオプションプロパティとしてnamesを定義しているあなたの遊び場

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

答えて

0

への遊び場、シンプルペーストこのために準備。 あなたの意図は、このキーは、JSON には存在しないかもしれないということであれば、decodeIfPresentを使用します。コンテナは、キーに関連付けられた値を持っていない場合、または値がnullの場合

extension Country { 
    public init(from decoder: Decoder) throws { 
     let values = try decoder.container(keyedBy: CodingKeys.self) 
     names = try values.decodeIfPresent([String].self, forKey: .names) 
    } 
} 

このメソッドはnilを返します。

しかし、それはデフォルトの動作で、 自動的に合成されるため、実際にあなただけの、あなたのカスタムinit(from decoder: Decoder) 実装(およびenum CodingKeys)を省略することができます。

備考:暗黙変数errorは そう

} catch { 
    print(error.localizedDescription) 
} 

ちょうどprint("error")(この特定の場合に ないが)よりも有益であることができる、任意catch節で定義されています。

+0

この作品をクール!しかし、それを 'Dictionary 'のために解決する方法。私は 'translations = try values.decodeIfPresent(Dictionary .self、forKey:.translations) 'を試しましたが、これは '操作を完了できませんでした。 (Swift.DecodingErrorエラー1.) '。これに対しても解決策はありますか? – Jan

+0

@Jan:私が知っている限り(しかし、私は100%確信していません)、JSONから任意の*辞書をデコードすることはできません。もちろんキーが固定されている場合は、それらのキーをプロパティとして持つ型を定義することができます: 'struct Translations:Decodable {var en:String?; var de:String?; ...} ' –

+0

私はDictsと協力しています:' var translations:[String:String?]? (文字列:String?)。自己、forKey:.translations) ' 'と 'translations = try values.decodeIfPresent – Jan

関連する問題