斯威夫特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 ..
谢谢你的帮助..!
答
全部hour
和minute
值是(单)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()
的数据sunrise
和sunset
在字典源自moon_phase
。所有值都被强制解开,因为日出和日落应该每天都存在;-)
PS:考虑定义更多的描述性变量名称,arrJSON
不是很有意义。
你是我的英雄...... :-)谢谢 – Heisenberg