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 只解析一个对象而不是一个数组的主要内容,如果未能解决你的问题,请参考以下文章

使用swift解析包含索引的json数据?

使用 EasyMapping (Swift) 解析 Json 数组

在 Swift 3 中解析 JSON (CLLocationCoordinate2D)

快速解析动态键的json响应问题

JSON文件解析给出对象名称而不是内容[关闭]

在 Swift 中从 JSON 对象解析多个数组