2017-07-02 74 views
0

我对Swift和iOS非常陌生,并且正在学习如何使用REST API调用。电话正常工作,我可以获取数据。我看不到正确解析整个数据。我正试图获得这些国家和他们的电话代码。我成功解析了国名并将它们存储在一个数组中,但出于某种原因,我无法解析包含每个国家/地区的调用代码的数组对象。解析JSON使用Swift 3解析另一个JSON数组中的一个对象的数组3

这里的JSON响应,我从API

[ 
{ 
name: "Afghanistan", 
topLevelDomain: [ 
".af" 
], 
alpha2Code: "AF", 
alpha3Code: "AFG", 
callingCodes: [ 
"93" 
], 
capital: "Kabul", 
altSpellings: [ 
"AF", 
"Afġānistān" 
], 
region: "Asia", 
subregion: "Southern Asia", 
population: 27657145, 
latlng: [ 
33, 
65 
], 
demonym: "Afghan", 
area: 652230, 
gini: 27.8, 
timezones: [ 
"UTC+04:30" 
], 
borders: [ 
"IRN", 
"PAK", 
"TKM", 
"UZB", 
"TJK", 
"CHN" 
], 
nativeName: "افغانستان", 
numericCode: "004", 
currencies: [ 
{ 
code: "AFN", 
name: "Afghan afghani", 
symbol: "؋" 
} 
], 
languages: [ 
{ 
iso639_1: "ps", 
iso639_2: "pus", 
name: "Pashto", 
nativeName: "پښتو" 
}, 
{ 
iso639_1: "uz", 
iso639_2: "uzb", 
name: "Uzbek", 
nativeName: "Oʻzbek" 
}, 
{ 
iso639_1: "tk", 
iso639_2: "tuk", 
name: "Turkmen", 
nativeName: "Türkmen" 
} 
], 
translations: { 
de: "Afghanistan", 
es: "Afganistán", 
fr: "Afghanistan", 
ja: "アフガニスタン", 
it: "Afghanistan", 
br: "Afeganistão", 
pt: "Afeganistão" 
}, 
flag: "https://restcountries.eu/data/afg.svg", 
regionalBlocs: [ 
{ 
acronym: "SAARC", 
name: "South Asian Association for Regional Cooperation", 
otherAcronyms: [ ], 
otherNames: [ ] 
} 
] 
}, 
..... 

] 

在这里得到的是我曾尝试

func getData2() { 
    let urlString = "https://restcountries.eu/rest/v2/all" 

    let url = URL(string: urlString) 
    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error!) 
     } else { 
      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]] 
       // let countryNames = parsedData.flatMap { $0["name"] as? String } 
       //let countryCodes = parsedData.flatMap { $0["callingCodes"] as? String } 

       for country in parsedData { 

        if let name = country["name"] as? String { 
         self.countryNamesArray.append(name) 
        } 
        if let capital = country["capital"] as? String { 
         print(capital) 
        } 

        if let code = country["callingCodes"] as? [[String:Any]] { 

         print("Got Here: ", code) 
         // why I get nothing here? 

         for tag in code { 
          print(tag) 
         // I get nothing here as well 
          } 
         } 
         //self.countryCodesArray.append(code) 
        } 
       } 

       //print(self.countryNamesArray) 
       // print(self.countryCodesArray) 
       self.searchTextField.filterStrings(self.countryNamesArray) 

      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 
} 

从Android背景的人,我认为这将是可能的索引数组和得到那个位置上的物品,但是这不起作用。请不要介意,因为我只是一个初学者,并且尽我所能学习Swift。

任何帮助,将不胜感激。

感谢

回答

0

进行这一更改代码

if let code = country["callingCodes"] as? [String] { 

         // if you want only first index use this 
         if code.count > 0{ 
         let countryCode = code[0] 
         print("First index Country Code",countryCode) 
         self.countryCodesArray.append(countryCode) 
         } 
} 
+0

真棒感谢,它的工作原理。我还有一个问题。一些呼叫代码多于一个,例如[“1809”,“1829”,“1849”],但我只想使用第一个。我如何索引第一个值? –

+0

我会编辑我的答案,请看看 –

+0

谢谢。一些国家代码是空的,但是即使在检查字符串是否为空之后,它也会发出索引错误。我如何检查调用代码是否存在以避免索引问题? –