2017-07-10 36 views
0

有人可以帮助我吗?我为此示例使用了Playground,因此您可以将整个代码放入Playground并查看结果。Codable/Decodable不解码

我发现,当我删除此行:

"address_format": "{{recipient}}\n{{street}}\n{{postalcode}} {{city}}\n{{country}}", 

它似乎工作。

(JSON的验证)

import UIKit 

struct Country : Decodable { 

    enum CodingKeys: String, CodingKey { 
     case continent 
     case alpha2 
     case name 
    } 

    var name : String? 
    var continent : String? 
    var alpha2 : String? 

} 

let json = """ 
[ 
{ 
"continent": "Europe", 
"alpha2": "AD", 
"alpha3": "AND", 
"country_code": "376", 
"currency": "EUR", 
"international_prefix": "00", 
"ioc": "AND", 
"latitude": "42 30 N", 
"longitude": "1 30 E", 
"name": "Andorra", 
"names": [ 
"Andorre", 
"Andorra", 
"アンドラ"], 
"translations": { 
"en": "Andorre", 
"it": "Andorra", 
"de": "Andorra", 
"fr": "Andorre", 
"es": null, 
"ja": "アンドラ", 
"nl": "Andorra", 
"ru": "Андорра"}, 
"national_destination_code_lengths": [2], 
"national_number_lengths": [6,7,8,9], 
"national_prefix": "None", 
"number": "020", 
"region": "Europe", 
"subregion": "Southern Europe", 
"un_locode": "AD", 
"languages": ["ca"], 
"nationality": "Andorran"}, 
{ 
"continent": "Asia", 
"address_format": "{{recipient}}\n{{street}}\n{{postalcode}} {{city}}\n{{country}}", 
"alpha2": "AE", 
"alpha3": "ARE", 
"country_code": "971", 
"currency": "AED", 
"international_prefix": "00", 
"ioc": "UAE", 
"latitude": "24 00 N", 
"longitude": "54 00 E", 
"name": "United Arab Emirates", 
"names": [ 
"United Arab Emirates", 
"Vereinigte Arabische Emirate", 
"Émirats Arabes Unis", 
"Emiratos Árabes Unidos", 
"アラブ首長国連邦", 
"Verenigde Arabische Emiraten"], 
"translations": { 
"en": "United Arab Emirates", 
"it": "Emirati Arabi Uniti", 
"de": "Vereinigte Arabische Emirate", 
"fr": "Émirats Arabes Unis", 
"es": "Emiratos Árabes Unidos", 
"ja": "アラブ首長国連邦", 
"nl": "Verenigde Arabische Emiraten", 
"ru": "Объединенные Арабские Эмираты"}, 
"national_destination_code_lengths": [2], 
"national_number_lengths": [7,8,9], 
"national_prefix": "0", 
"number": "784", 
"region": "Asia", 
"subregion": "Western Asia", 
"un_locode": "AE", 
"languages": ["ar"], 
"nationality": "Emirian"} 
] 
""".data(using: .utf8)! 

let decoder = JSONDecoder() 
do { 
    let countries = try decoder.decode([Country].self, from: json) 
    print(countries) 

} catch { 
    print("erro") 
} 

回答

1

如果您将打印 “在字符722侦测到的控制字符” 实际错误信息

,而不是毫无意义的文字串"erro" 的解决办法是显而易见的:

换行字符\n必须进行转义:

"address_format": "{{recipient}}\\n{{street}}\\n{{postalcode}} {{city}}\\n{{country}}", 

可以解决该问题与

let json = """ 
[ 
... 
] 
""".replacingOccurrences(of: "}\n{", with: "}\\n{").data(using: .utf8)! 
+0

如何我可以预先格式化它们吗?此数据来自API – Jan

+0

我更新了答案。 – vadian