2014-10-05 3 views
0

날씨 API 인 Wunderground에서 날씨 데이터를 가져 오는 Swift 프로젝트를 작성 중입니다. 이제 온도 나 상대 습도와 같은 정보를 추출 할 수 있지만 swift를 사용하여 중첩 목록의 내부 목록에 정보를 저장하는 데 문제가 있습니다. 예를 들어, "current_observation"에 저장된 "display_location.state"정보를 가져올 수 없습니다.Weather API에서 json 데이터 형식으로 저장된 특정 정보를 찾는 방법

다음은 Wunderground에서 제공하는 날씨 정보의 예는 다음과 같습니다

{ 
    "response": { 
    "version":"0.1", 
    "termsofService":"http://www.wunderground.com/weather/api/d/terms.html", 
    "features": { 
    "conditions": 1 
    } 
    } 
    , "current_observation": { 
     "image": { 
     "url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png", 
     "title":"Weather Underground", 
     "link":"http://www.wunderground.com" 
     }, 
     "display_location": { 
     "full":"San Francisco, CA", 
     "city":"San Francisco", 
     "state":"CA", 
     "state_name":"California", 
     "country":"US", 
     "country_iso3166":"US", 
     "zip":"94101", 
     "magic":"1", 
     "wmo":"99999", 
     "latitude":"37.77500916", 
     "longitude":"-122.41825867", 
     "elevation":"47.00000000" 
     }, 
     "temperature_string":"76.3 F (24.6 C)", 
     "relative_humidity":"43%", 
    } 
} 

여기에 날씨 정보를 추출 내 스위프트 코드 :

var url = NSURL(string:"http://api.wunderground.com/api/56968011acc3e3eb/conditions/q/\(state)/\(city).json") 
var data = NSData.dataWithContentsOfURL(url, options: NSDataReadingOptions.DataReadingUncached, error: nil) 
var str = NSString(data:data, encoding:NSUTF8StringEncoding) 
var json:AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) 
var weatherInfo:AnyObject! = json.objectForKey("current_observation") 
var currentTemp: AnyObject! = weatherInfo.objectForKey("temperature_string") 
var humidity:AnyObject! = weatherInfo.objectForKey("relative_humidity") 
var wind:AnyObject! = weatherInfo.objectForKey("wind_kph") 
display.text = "Temperature: \(currentTemp)\nHumidity: \(humidity)\nWind: \(wind)\n" 

는 감사가!

답변

1

스타일에 대한 간단한 설명으로, 변수를 처음 설정 한 후에 변수 값을 변경하지 않을 때는 언제든지 var 대신 let을 사용해야합니다.

올바르게 보이지 않는 유일한 방법은 JSON에서 하위 오브젝트를 끌어내는 것입니다. 당신은 current_observation OUT으로 개체를 끌어 때 JSON의 데이터 구조는 적절한 객체에 물건을 던져 있는지, 당신이 할 필요가 그래서이

NSDictionary { 
    "response": NSDictionary {}, 
    "current_observation": NSDictionary { 
      "relative_humidity": NSString 
      ... 
    } 
    ... 
} 

같이 있다는 사실을 숙지

let json = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments, error:nil) as NSDictionary 
let weatherInfo = json["current_observation"] as NSDictionary 
let currentTemp = weatherInfo["temperature_string"] as NSString 
... 

이와 같이 뭔가 정직하기는하지만 EasyMapping을 사용하는 것이 좋습니다. 그럼 당신은 단지 JSON을 표현하기 위해 신속 클래스를 설정할 수 있으며,지도 제공자는 그래서 당신은 단지

if let weatherInfo = EKMapper.objectFromExternalRepresentation(json, withMapping:/*mapping provider*/) { 
    //do stuff 
} 

처럼 뭔가를 할 수 있으며, 당신은 모두가 빠른 개체로 JSON에서 직렬화 복원합니다. 또한 JSON 구조가 변경되거나 거기에있을 것으로 예상되는 값이 누락 된 경우 응용 프로그램이 손상되는 것을 방지합니다.