iOS 编程,获取 JSON 数据

Posted

技术标签:

【中文标题】iOS 编程,获取 JSON 数据【英文标题】:iOS programming, fetching JSON data 【发布时间】:2016-04-21 23:14:39 【问题描述】:

我已将 SwiftyJSON.swift 文件添加到我的项目中,并且我正在尝试从网络上获取一些数据。现在我的项目运行,但只运行到我试图从字典中的 json 获取数组的那一行。我不明白问题出在哪里,但我猜它一定是非常愚蠢的,因为我刚刚开始学习 swift。

我只是想在控制台中打印来自该 url 的所有电影的名称,在我设法达到这个性能之后,我将尝试获取电影的摘要,然后将它们放在 TableView 中。

import UIKit

class FirstViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        //grab the status code and check if the transfer was successful == 200
        let requestURL: NSURL = NSURL(string: "https://itunes.apple.com/us/rss/topmovies/limit=50/json")!
        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) 

                //sort through the stations key and cast the data into an array of dictionaries
                do
                    let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
                    print("bbbbb")

// From here on, it doesn't print anything anymore
                    if let movies = json["entry"] as? [[String: AnyObject]] 
                        print(movies)
                        print("test")

                        for movie in movies 

                            if let name = movie["name"] as? String 
                                print("mmmm")
                                print("%@ (Built %@)",name)

                            
                        

                    

                catch 
                    print("Error with Json: \(error)")
                
            
        
    task.resume()

【问题讨论】:

在你尝试获取movies之前,尝试通过“print("json contents is \(json)")”打印出json字典的内容。我很想知道是否真的有@987654326 @? 我猜有,但它可能嵌套在其他东西中。 通过查看这个,我会在黑暗中刺伤并说 json 没有名为 entry 的键。如果你想强制错误改变你的 as?作为!它可能会让你知道发生了什么。 @MichaelDautermann 我刚刚在我尝试获取电影的行之前添加了您的打印行,但它仍然没有打印任何内容,我在控制台中唯一拥有的是来自以前的印刷品。 @Jthomps 我也尝试过从 ?到 !我得到了这个:条件绑定的初始化程序必须具有可选类型,而不是 [[String: AnyObject]] 这是 json 数据:itunes.apple.com/us/rss/topmovies/limit=50/json 【参考方案1】:

entry是一个json数组,使用.array

if let movies = json["entry"].array 
  for movie in movies 
     // Do stuff
  

也是一般提示。不要转换值,例如

movie["something"] as? String

宁可使用内置功能:

movie["something"].string

更新

仔细查看您的代码,我发现您实际上根本没有使用SwiftyJSON.swift。 要使用 Swifty,您可以像这样解析 json 文本并获得一个 JSON 对象:

let jsonObj = JSON(data: yourData) // data is a NSData

请再看一下文档:

https://github.com/SwiftyJSON/SwiftyJSON

我认为您正在阅读“为什么 Swift 中的典型 JSON 处理不好?”部分。该部分解释了在 Swift 中管理 json 的原生和“糟糕”方式,真正的文档在下面。

【讨论】:

仍然无法正常工作,它只会在控制台中打印 bbbbb,之后仅此而已 >:(

以上是关于iOS 编程,获取 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发——XML/JSON数据解析

iOS开发——XML/JSON数据解析

iOS网络编程开发—JSON解析与XML解析

在 iOS EventKit 上以编程方式在线获取/更新谷歌日历数据

非常基本的 JSON 到 tableView (iOS)

如何在我的应用程序中获取 JSON 数据