斯威夫特JSON解析Wunderground

问题描述:

我与SWIFT的Progrmamming初学者,我需要从JSON值它看起来像这样:斯威夫特JSON解析Wunderground

{ 
    "response": { 
    "version":"0.1", 
    "termsofService":"http://www.wunderground.com/weather/api/d/terms.html", 
    "features": { 
    "astronomy": 1 
    } 
    } 
     , "moon_phase": { 
     "percentIlluminated":"23", 
     "ageOfMoon":"5", 
     "phaseofMoon":"Erstes Viertel", 
     "hemisphere":"North", 
     "current_time": { 
     "hour":"8", 
     "minute":"28" 
     }, 
     "sunrise": { 
     "hour":"6", 
     "minute":"55" 
     }, 
     "sunset": { 
     "hour":"19", 
     "minute":"50" 
     }, 
     "moonrise": { 
     "hour":"9", 
     "minute":"50" 
     }, 
     "moonset": { 
     "hour":"0", 
     "minute":"06" 
     } 
    }, 
    "sun_phase": { 
     "sunrise": { 
     "hour":"6", 
     "minute":"55" 
     }, 
     "sunset": { 
     "hour":"19", 
     "minute":"50" 
     } 
    } 
} 

我会从日落和日出到一个变量得到小时&分钟!

我的代码:

var sunriseHour: [String] = [] 
    var sunriseMinute: [String] = [] 
    var sunsetHour: [String] = [] 
    var sunsetMinute: [String] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     let url=URL(string:"http://api.wunderground.com/api/dbd539bd631e/astronomy/lang:DL/q/DL/iphofen.json") 
     do { 
      let allData = try Data(contentsOf: url!) 
      let data = try JSONSerialization.jsonObject(with: allData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : AnyObject] 
      if let arrJSON = data["moon_phase"] { 


         if let sunriseData = arrJSON["sunrise"]{ 



       print(sunriseData) 
             } 
       if let sunsetData = arrJSON["sunset"]{ 

      print(sunsetData) 
       } 
      } 
      print("hour: ",sunriseHour) 
      print("minute: ",sunriseMinute) 
      print("hour: ",sunsetHour) 
      print("minute: ",sunsetMinute) 


     } 
     catch { 

     } 

      } 

i相打印(sunriseData)和印刷(sunsetData)从此正确的数据得到:

可选({ 小时= 6; 分钟= 55 ;})可选(小时= 19; 分钟= 50;})小时:[]分钟:[]小时:[]分钟:[]

我如何得到它在变量sunriseHour,sunriseMinute,sunsetHour,sunsetMinute ..

谢谢你的帮助..!

全部hourminute值是(单)String而不是[String](数组)。

声明所有变量作为空字符串

var sunriseHour = "" 
var sunriseMinute = "" 
var sunsetHour = "" 
var sunsetMinute = "" 

那么就不要从远程URL同步加载数据,总是使用异步方式:

 let url = URL(string:"http://api.wunderground.com/api/dbd539bd631e/astronomy/lang:DL/q/DL/iphofen.json")! 

     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if error != nil { 
       print(error!) 
      } else { 
       do { 
        guard let jsonData = try JSONSerialization.jsonObject(with:data!) as? [String:Any], 
          let moonPhase = jsonData["moon_phase"] as? [String:Any] else { return } 

        let sunrise = moonPhase["sunrise"] as! [String:String] 
        let sunset = moonPhase["sunset"] as! [String:String] 

        sunriseHour = sunrise["hour"]! 
        sunriseMinute = sunrise["minute"]! 

        sunsetHour = sunset["hour"]! 
        sunsetMinute = sunset["minute"]! 

        print("Sunrise - \(sunriseHour):\(sunriseMinute)" 
        print("Sunset - \(sunsetHour):\(sunsetMinute)" 

       } catch { 
        print(error) 
       } 
      } 
     } 
     task.resume() 

的数据sunrisesunset在字典源自moon_phase。所有值都被强制解开,因为日出和日落应该每天都存在;-)

PS:考虑定义更多的描述性变量名称,arrJSON不是很有意义。

+0

你是我的英雄...... :-)谢谢 – Heisenberg