Swift 语言中的 JSON
Posted
技术标签:
【中文标题】Swift 语言中的 JSON【英文标题】:JSON in Swift language 【发布时间】:2014-08-13 16:28:47 【问题描述】:我成功地完成了一个使用Swift
在UITableView
中显示来自iTunes 的最新热门电影的教程,但现在我想用我自己的替换iTunes JSON
信息。虽然它运行良好并显示 iTunes 信息,但我的信息没有显示。我用valueForKeyPath
尝试了各种方法,但还是没有。
.SWIFT 文件
let urlString = "https://itunes.apple.com/us/rss/topmovies/limit=25/json"
var titles = [String]()
func fetchItems(success: () -> ())
let url = NSURL(string: urlString)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task = session.dataTaskWithURL(url) (data, response, error) in
var jsonError: NSError?
let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as NSDictionary
if let unwrappedError = jsonError
println("json error: \(unwrappedError)")
else
self.titles = json.valueForKeyPath("feed.entry.im:name.label") as [String]
success()
task.resume()
这很成功,但是当我添加以下 url 而不是 iTunes' 并尝试更改 valueForKeyPath
时,我遇到了运行时错误。
JSON 文件
"results":[
"text":"@twitterapi http://tinyurl.com/ctrefg",
"to_user_id":396524,
"to_user":"TwitterAPI",
"from_user":"jkoum",
"metadata":
"result_type":"popular",
"recent_retweets": 109
,
"id":1478555574,
"from_user_id":1833773,
"iso_language_code":"nl",
"source":"<a href="http://twitter.com/">twitter< /a>",
"profile_image_url":"http://s3.amazonaws.com/twitter_production/profile_images/118412707/2522215727_a5f07da155_b_normal.jpg",
"created_at":"Wed, 08 Apr 2009 19:22:10 +0000",
... truncated ...],
"since_id":0,
"max_id":1480307926,
"refresh_url":"?since_id=1480307926&q=%40twitterapi",
"results_per_page":15,
"next_page":"?page=2&max_id=1480307926&q=%40twitterapi",
"completed_in":0.031704,
"page":1,
"query":"%40twitterapi"
这个JSON
文件与iTunes 的文件有什么不同吗?我会用什么作为valueForKeyPath
?
【问题讨论】:
什么是运行时错误? _UIScreenEdgePanRecognizerEdgeSettings.edgeRegionSize=13.000000 致命错误:在展开可选值时意外发现 nil 那是我使用'valueForKeyPath("results.text.to_user_id.to_user.from_user")'的时候 【参考方案1】:您的密钥路径中的.text.to_user_id.to_user.from_user
无效,text
、to_user_id
to_user
和 from_user
都是兄弟姐妹。
如果你想要from_user
,你的keypath应该是results.from_user
【讨论】:
当我回顾 iTunes 的 JSON 文件时,这很有意义......但我仍然收到“在展开可选值时意外发现 nil”错误。我是否在某处遗漏了一个令人困惑的可选选项? 错误出现在这一行:“let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as NSDictionary”data
是否包含任何内容?您应该在尝试反序列化 data
对象之前检查 error
,因为当出现错误时它可能为 nil。
你的问题。 unexpectedly found nil while unwrapping an Optional value
表示您尝试使用 None 值访问 Optional。 data
作为 session.dataTaskWithURL
完成块的隐式解包选项返回。使用前检查它不为零。
太好了,谢谢!但是......我的困惑是 iTunes 的 JSON 文件和我的发生了什么变化?为什么数据当时收到信息而不是现在?它是不同类型的 JSON 文件吗?这意味着我的代码只适用于一种 JSON 文件,而不适用于另一种。【参考方案2】:
您提供的 JSON 文件看起来不错,但请通过http://jsonlint.com/ 确认。
还要确保你的 valueForKeyPath 是正确的。我建议尝试使用 Apple 的,以确保它在继续使用您的之前先正常工作。
【讨论】:
以上是关于Swift 语言中的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致
Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用