2016-02-24 2 views
2

Я занимался анализом данных JSON из API карт google, чтобы получить текущее местоположение города с использованием долготы & широты.Анализ данных json из google maps api in swift

Но теперь я застрял с моим кодом здесь, и я не могу получить доступ к данным в результатах. Например, я хочу получить данные в «Administrative_area_level_2» для ключа «long name». Как я могу получить к нему доступ?

dispatch_async(dispatch_get_main_queue(), { 

      if let urlContent = data{ 
       do{ 
        let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
        if let results = jsonResult["results"] as? [[String : AnyObject]] { 

         for result in results{ 

          if let addressComponents = result["address_components"] as? [[String : AnyObject]] { 

           print(addressComponents) 
          } 
         } 
        } 
        // print(jsonResult) 

       } catch{ 

       } 

      } 

     }) 

Вот результаты addressComponents JSON в консоли:

[["types": (
    route 
), "short_name": Abou Al MAGD Al Askalani, "long_name": Abou Al MAGD Al Askalani], ["types": (
    "administrative_area_level_3", 
    political 
), "short_name": Al Golf, "long_name": Al Golf], ["types": (
    "administrative_area_level_2", 
    political 
), "short_name": Nasr City, "long_name": Nasr City], ["types": (
    "administrative_area_level_1", 
    political 
), "short_name": Cairo Governorate, "long_name": Cairo Governorate], ["types": (
    country, 
    political 
), "short_name": EG, "long_name": Egypt]] 

Вот результаты JsonResult результаты в консоли:

results =  (
      { 
     "address_components" =    (
          { 
       "long_name" = "Abou Al MAGD Al Askalani"; 
       "short_name" = "Abou Al MAGD Al Askalani"; 
       types =      (
        route 
       ); 
      }, 
          { 
       "long_name" = "Al Golf"; 
       "short_name" = "Al Golf"; 
       types =      (
        "administrative_area_level_3", 
        political 
       ); 
      }, 
          { 
       "long_name" = "Nasr City"; 
       "short_name" = "Nasr City"; 
       types =      (
        "administrative_area_level_2", 
        political 
       ); 
      }, 
          { 
       "long_name" = "Cairo Governorate"; 
       "short_name" = "Cairo Governorate"; 
       types =      (
        "administrative_area_level_1", 
        political 
       ); 
      }, 
          { 
       "long_name" = Egypt; 
       "short_name" = EG; 
       types =      (
        country, 
        political 
       ); 
      } 
     ); 

ответ

0

В одном из моих приложений я Загрузка данных о месте используя местоID. Однако результаты возвращаются в том же формате, что и у вас. Вот фрагмент кода, который может вам помочь:

let task = NSURLSession.sharedSession().dataTaskWithURL(url) {(data, _, retError) in 
if let error = retError { 
    self.error = .RequestError(error) 
    return 
} 
guard 
    let JSON = data else { 
     self.error = .CannotParseData 
     return 
} 
do { 
    let json = try NSJSONSerialization.JSONObjectWithData(JSON, options: .MutableContainers) 
    guard 
     let results = json["results"] as? [[String: AnyObject]] 
     else { 
      self.error = .CannotParseData 
      return 
    } 
    if results.count == 0 { 
     self.error = .NoResults 
     return 
    } 

    let result = results[0] 
    // first check that locality exists 
    guard let resultTypes = result["types"] as? [String], 
     let addressComponents = result["address_components"] as? [[String:AnyObject]], 
     let formattedAddress = result["formatted_address"] as? String, 
     let geometry = result["geometry"] as? [String:AnyObject], 
     let location = geometry["location"] as? [String:Double], 
     let lat = location["lat"], 
     let lng = location["lng"] 
     else { 
      //let error = NSError() 
      self.error = .CannotParseData 
      return 
     } 
     // at this point you can use all the variables declared above 
    } 
} 

Надеюсь, это будет полезно.

+0

Вы можете разместить свой код в качестве ответа? :) Я бы хотел проверить это сам –

+0

Отметьте ответ в ответе @ Вадана .... –

2

Для глубоко вложенного JSON я бы рекомендовал стороннюю библиотеку, такую ​​как SwiftyJSON, но это решение «без». Она использует функцию filter, чтобы получить элемент, содержащий запрашиваемую type

if let urlContent = data { 
    do { 
    let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions()) as! [String : AnyObject] 

    if let results = jsonResult["results"] as? [[String : AnyObject]] { 
     for result in results{ 
     if let addressComponents = result["address_components"] as? [[String : AnyObject]] { 

      let filteredItems = addressComponents.filter{ if let types = $0["types"] as? [String] { 
      return types.contains("administrative_area_level_2") } else { return false } } 
      if !filteredItems.isEmpty { 
      print(filteredItems[0]["long_name"] as! String) 
      } 
     } 
     } 
    } 
    } catch let error as NSError { 
    print(error) 
    } 
} 
+0

Спасибо Вадай за подсказку и усилие. Я использовал 'SwiftJSON' в конце, и я сделал все это в двух строках ...: D' let jsonResult = JSON (data: data!) let areaLongName = jsonResult ["results"] [0] ["address_components" ] [2] [ "значение параметра long_name"]. stringValue' –

Смежные вопросы