Ios Swift 2解析和读取JSON

Ios Swift 2解析和读取JSON,ios,json,swift2,Ios,Json,Swift2,我是Swift 2.0新手,但我有OOP语言方面的经验。我试图通过JSON API在标签中显示城市的名称。但我经常会遇到错误“EXC_BAD_指令”和“Unwrapping nil”错误。我想问题可能出在URL上。因为我尝试了另一个API,radnomuser.me/API,结果没有错误。有人能给我一个解决方案吗?因为我在网上得到的答案太多了,而且都不一样。如果你不理解我的问题,请尽管问,因为我认为这是一个关键部分。 谢谢 首先,您必须在InterfaceBuilder中链接您的IBOutle

我是Swift 2.0新手,但我有OOP语言方面的经验。我试图通过JSON API在标签中显示城市的名称。但我经常会遇到错误“EXC_BAD_指令”和“Unwrapping nil”错误。我想问题可能出在URL上。因为我尝试了另一个API,radnomuser.me/API,结果没有错误。有人能给我一个解决方案吗?因为我在网上得到的答案太多了,而且都不一样。如果你不理解我的问题,请尽管问,因为我认为这是一个关键部分。 谢谢

  • 首先,您必须在InterfaceBuilder中链接您的IBOutlet。这可能是第一个可以得到展开零错误的点
  • 第二点,viewDidLoad是视图控制器上的一个方法,我不明白为什么在UITextView之后加上括号
  • 第三,代码中没有声明viaSegueLabel
  • 第四,尽量不要强制展开这么多选项(使用!),而是使用if-let
  • 对于第一次迭代,我将更改getWeatherData方法,如下所示:

    func getWeatherData() {
        let endpoint = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98")
        if let endpoint = endpoint, data = NSData(contentsOfURL: endpoint) {
            do {
                if let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
                    if let name = json["name"] as? String
                    {
                        print(name)
                    }
                }
            } catch let error as NSError{
                print("\(error)")
            }
        }
    }
    
      • 首先,您必须在InterfaceBuilder中链接您的IBOutlet。这可能是第一个可以得到展开零错误的点
      • 第二点,viewDidLoad是视图控制器上的一个方法,我不明白为什么在UITextView之后加上括号
      • 第三,代码中没有声明viaSegueLabel
      • 第四,尽量不要强制展开这么多选项(使用!),而是使用if-let
      • 对于第一次迭代,我将更改getWeatherData方法,如下所示:

        func getWeatherData() {
            let endpoint = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=44db6a862fba0b067b1930da0d769e98")
            if let endpoint = endpoint, data = NSData(contentsOfURL: endpoint) {
                do {
                    if let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
                        if let name = json["name"] as? String
                        {
                            print(name)
                        }
                    }
                } catch let error as NSError{
                    print("\(error)")
                }
            }
        }
        
      SWIFT 3

      func WeatherData() { guard let endpoint=NSURL(字符串:“”), 让data=NSData(contentsOf:endpoint作为URL)else{return}

          do {
              if let json = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary {
                  if let weather = json["weather"] as? NSDictionary {
                      print(weather) // London
                  }
              }
          } catch let error as NSError{
              print("\(error)")
          }
      }
      
      斯威夫特3

      func WeatherData() { guard let endpoint=NSURL(字符串:“”), 让data=NSData(contentsOf:endpoint作为URL)else{return}

          do {
              if let json = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary {
                  if let weather = json["weather"] as? NSDictionary {
                      print(weather) // London
                  }
              }
          } catch let error as NSError{
              print("\(error)")
          }
      }
      

      解析和阅读都很好。你的
      viaSegueLabel
      是零。我在操场上试过你的下载/解析代码片段,它解析得很好。还有下一次-永远不要发布你的应用程序id、登录名等。谢谢你的提示,这只是测试应用程序,只是读取JSON和显示数据,但我明白你的意思。我还是不明白。我知道我有nil,这意味着我没有从JSON获得值。出于某种原因,它在“if”之前停止,viaSequeLabel为零,因为它没有对其进行解析,或者因为URL错误或其他原因?感谢您的回复。这不是问题所在,但
      JSONObjectWithData
      没有返回可选绑定,因此可选绑定没有用。请将
      let json=尝试NSJSONSerialization.JSONObjectWithData(jsonData,选项:[])写入![字符串:AnyObject]
      ,如果发生错误,则将禁用捕捉块executed@vadian你能推荐我应该用什么吗?解析和阅读都很好。你的
      viaSegueLabel
      是零。我在操场上试过你的下载/解析代码片段,解析得很好。还有下次-永远不要发布你的应用程序id、登录名等。谢谢你的提示,这只是测试应用程序,只是读取JSON并显示数据,但我理解你的意思。我仍然不明白。我知道我有nil,这意味着我没有从JSON中获得值。出于某种原因,它在“if”之前停止,viaSequeLabel为零,因为它没有对其进行解析,或者因为URL错误或其他原因?感谢您的回复。这不是问题所在,但
      JSONObjectWithData
      没有返回可选绑定,因此可选绑定没有用。请将
      let json=尝试NSJSONSerialization.JSONObjectWithData(jsonData,选项:[])写入![字符串:AnyObject]
      ,如果发生错误,则将禁用捕捉块executed@vadian你能推荐我应该使用什么吗?很抱歉错误的变量声明,viaSegueLabel是一个出口,它被声明了,但我写错了。我试图不强制它,但Xcode强迫我这样做。谢谢你的回答。很抱歉错误的变量声明ion,viaSegueLabel是一个出口,它被声明了,但我写错了。我试着不强迫它,但Xcode强迫我这样做。谢谢你的回答。