【问题标题】:In Swift, check if a key exists in JSON在 Swift 中,检查 JSON 中是否存在键
【发布时间】:2015-09-18 17:47:19
【问题描述】:

我有以下功能。它应该从 API 网页获取当前歌曲播放信息。播放歌曲时,页面会显示:

{“艺术家”:“艺术家”,“歌曲”:“歌曲”}

当没有可用数据时(没有歌曲正在播放):

{ "error" : "未提供歌曲元数据" }

有没有办法检查“错误”键是否存在?或者我该怎么处理这个问题?

func songNowPlaying() {
    let endpoint = NSURL(string: "http://api.vicradio.org/songs/current")
    let jsonData = NSData(contentsOfURL: endpoint!)

    do {
        let parsed = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray
        SongNowText.text = parsed.valueForKey("song").componentsJoinedByString("")
        ArtistNowText.text = parsed.valueForKey("artist").componentsJoinedByString("")
    }
    catch let error as NSError {
        print("\(error)")
    }
}

【问题讨论】:

  • 我不熟悉我的 Swift,但 parsed.valueForKey("song") 不会引发错误,然后在您的 catch 块中您可以访问 error 键吗?
  • @Sam 这是一个聪明的主意。我得到的错误与我预期的不同。当出现“错误”情况时,它只会让我解析为 NSMutableArray?我不明白,但我会继续玩它。谢谢。

标签: json swift2


【解决方案1】:

URL 返回 JSON 字典而不是数组。您可以通过这种方式检查这两种情况

func songNowPlaying() {
  let endpoint = NSURL(string: "http://api.vicradio.org/songs/current")
  if let jsonData = NSData(contentsOfURL: endpoint!) {

    do {
      let parsed = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) as! [String:String]
      if let error = parsed["error"] {
        print("Result error: \(error)")
      } else {
        if let song = parsed["song"] { 
          SongNowText.text = song 
        }
        if let artist = parsed["artist"] { 
          ArtistNowText.text = artist
        }
      }
    }
    catch let error as NSError {
      print("Serialization error: \(error)")
    }
  }
}

因为 JSON 对象可以向下转换为 [String:String],所以不需要进一步向下转换。

【讨论】:

  • 哦,不,当信息从“song”和“artist”变为“error”时,我得到“fatal error: unexpectedly found nil while unwrapping an Optional value”
  • 您没有提到其他键也可以是可选的。我更新了帖子
  • 我的错误,我很抱歉。谢谢。
  • 再次抱歉,但我再次收到“致命错误:在展开可选值时意外发现 nil”。它在“let parsed = try ...”行上显示 EXC_BAD_INSTRUCTION。对此有何想法?
  • 那么从URL下载的数据可能是无效的。我也会更新帖子以考虑这种情况
猜你喜欢
  • 2021-06-27
  • 2022-07-12
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多