Swift 语言中的 JSON

Posted

技术标签:

【中文标题】Swift 语言中的 JSON【英文标题】:JSON in Swift language 【发布时间】:2014-08-13 16:28:47 【问题描述】:

我成功地完成了一个使用SwiftUITableView 中显示来自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&amp;q=%40twitterapi",

     "results_per_page":15,

     "next_page":"?page=2&amp;max_id=1480307926&amp;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 无效,textto_user_id to_userfrom_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 对象作为字典以在视图控制器中使用

在 Swift 中写入 JSON 中的***类型无效

JSON 解析 --> Swift | JSON 写入中的***类型无效

swift Swift 4中的自定义JSON编码/解码

Swift 中的 JSON 解析