Swift 和 JSON 只解析一个对象而不是一个数组
Posted
技术标签:
【中文标题】Swift 和 JSON 只解析一个对象而不是一个数组【英文标题】:Swift and JSON parsing only an object not an array 【发布时间】:2016-06-03 14:50:45 【问题描述】:我正在开发一个解析 JSON 数据并将我的标签文本设置为 JSON 请求的临时值的天气应用程序。我从天气对象数组中获得了 id 的值,但是 temp 不在数组中,它只是一个对象。有人可以告诉我我错在哪里。我的价值是零,因为我没有正确获取它。这是我的 sn-p 和 JSON。
@IBAction func getWeather(sender: AnyObject)
let requestURL: NSURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=MYAPPID")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest)
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200)
print("JSON Downloaded Sucessfully.")
do
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let today = json["weather"] as? [[String: AnyObject]]
//this is pulling 4 key value pairs
for weather in today
//this works
let id = weather["id"]?.stringValue
self.trumpDescription.text=id;
print(id)
//this is where I am confused it changes from an array to just an object
let temp = json["temp"] as? String
self.currentTempView.text=temp;
print(temp)
catch
print("Error with Json: \(error)")
task.resume()
`
这是 JSON:
"coord":
"lon": 138.93,
"lat": 34.97
,
"weather": [
"id": 803,
"main": "Clouds",
"description": "broken clouds",
"icon": "04n"
],
"base": "cmc stations",
"main":
"temp": 292.581,
"pressure": 1019.48,
"humidity": 99,
"temp_min": 292.581,
"temp_max": 292.581,
"sea_level": 1028.92,
"grnd_level": 1019.48
,
"wind":
"speed": 5.36,
"deg": 237.505
,
"clouds":
"all": 64
,
"dt": 1464964606,
"sys":
"message": 0.0037,
"country": "JP",
"sunrise": 1464895855,
"sunset": 1464947666
,
"id": 1851632,
"name": "Shuzenji",
"cod": 200
【问题讨论】:
temp
的值在对象中。 jsonlint.com
temp 不在天气中...它是 main 的对象
看看这个,generated model for openweathermap 它可能会为你节省一些时间。
【参考方案1】:
应该是这样的
if let main = json["main"] as? NSDictionary
let temp = main["temp"] as! String
print(temp)
【讨论】:
感谢您的示例,我现在理解了逻辑。谢谢。【参考方案2】:而不是这个:let temp = json["temp"] as? String
试试这个:
if let main = json["main"] as? [String: AnyObject]
let temp = main[temp]?.stringValue
print(temp)
//alternatively you can try this as per your convenience of data type
let tempNew = main[temp]?.doubleValue
print(tempNew)
【讨论】:
以上是关于Swift 和 JSON 只解析一个对象而不是一个数组的主要内容,如果未能解决你的问题,请参考以下文章
使用 EasyMapping (Swift) 解析 Json 数组