将JSON NSData转换为字典。

4

我有一个类似这样的JSON文件。

{   
"Team Name" : "Team",
"Images" : "images",
"Players" : [
    {
        "Number" : "61",
        "Height" : "6'5\"",
        "Position" : "P",
        "DOB" : "Feb 22, 1989",
        "First Name" : "Chris",
        "Weight" : "210",
        "Last Name" : "Shmoe",
        "Bats" : "R",
        "Throws" : "R"
    },
    {
        "Number" : "54",
        "Height" : "6'3\"",
        "Position" : "P",
        "DOB" : "Dec 31, 1982",
        "First Name" : "Ronald",
        "Weight" : "240",
        "Last Name" : "Peter",
        "Bats" : "R",
        "Throws" : "R"
    },
    {
        "Number" : "67",
        "Height" : "6'4\"",
        "Position" : "P",
        "DOB" : "Sep 24, 1984",
        "First Name" : "Scott",
        "Weight" : "215",
        "Last Name" : "Tim",
        "Bats" : "R",
        "Throws" : "R"
    },

这是我的内容。
  var downloadFailed = false
    var error: NSError? = nil

    let navigationController = self.window!.rootViewController as! UINavigationController
    let masterController = navigationController.childViewControllers[0] as! PlayerViewController

    if let url = NSURL(string: " ") {

        if let urlData = NSData(contentsOfURL: url) {
            let jsonString = NSString(data: urlData, encoding: NSUTF8StringEncoding)
            println(jsonString)
            var result = NSJSONSerialization.JSONObjectWithData(urlData, options: NSJSONReadingOptions.allZeros, error: nil) as? NSDictionary

            print("dictionary created")
            if let players = result?.objectForKey("Players") as? [[String:AnyObject]]
            {

                for dictionary in players{

                    let fname = players["First Name"]
                    let lname = array["Players"]?["Last Name": String]
                    let number = array["Players"]?["Number"]
                    let position = array["Players"]?["Position"]
                    let bats = array["Players"]?["Bats"]?!.string
                    let throws = array["Players"]?["Throws"]?!.string
                    let height = array["Players"]?["Height"]?!.string
                    let weight = array["Players"]?["Weight"]?!.string
                    let DOB = array["Players"]?["DOB"]?!.string


                   masterController.objects.append(Players(fName: (fname as String?)!, lname: (lname as String?)!, position: (position as String?)!, bats: (bats as String?)!, throws: (throws as String?)!, height: (height as String?)!, weight: (weight as String?)!, DOB: (DOB as String?)!, number: (number as String?)!))}

目前我认为唯一不正确的是我不知道如何使代码正确读取,以便使用键“Players”并从JSON文件中读取正确的信息。

编辑:

我已经在努力解决问题,现在很少出现错误,只是没有停止崩溃。

 if let dict = array as? [String: AnyObject]

但这是我新的加载数据函数代码:

但这是我的新的“加载数据”函数的代码:

 func preloadData() {


        var downloadFailed = false
        var error: NSError? = nil

        let navigationController = self.window!.rootViewController as! UINavigationController
        let masterController = navigationController.childViewControllers[0] as! PlayerViewController

        if let url = NSURL(string: "removed for reasons") {

            if let urlData = NSData(contentsOfURL: url) {

                if let array: AnyObject! = NSJSONSerialization.JSONObjectWithData(urlData, options: nil, error: &error)
                {
                    print (array)
                    if let dict = array as? [String: AnyObject]
                    {
                    if let players = dict["Players"] as? [AnyObject]
                    {
                    for dictionary in players {
                    let fname = dictionary["First Name"]
                    let lname = dictionary["Last Name"]
                    let number = dictionary["Number"]
                    let position = dictionary["Position"]
                    let bats = dictionary["Bats"]
                    let throws = dictionary["Throws"]
                    let height = dictionary["Height"]
                    let weight = dictionary["Weight"]
                    let DOB = dictionary["DOB"]


                   masterController.objects.append(Players(fName: fname as! String, lname: lname as! String, position: position as! String, bats: bats as! String, throws: throws as! String, height: height as! String, weight: weight as! String, DOB: DOB as! String, number: number as! String))
                        }
                        }
                }

                //masterController.objects.sort({$0.courseNumber < $1.courseNumber})
            }
            else
            {
                downloadFailed = true
            }
        } else {
            downloadFailed = true
        }
    } else {
        downloadFailed = true
    }

    if downloadFailed {
        let alert = UIAlertView(title: "Error", message: "Unable to download course data", delegate: nil, cancelButtonTitle: "OK")
        alert.show()
    }
}

你想要实现什么目标? - Daniel T.
我想做的是从一个JSON文件中读取数据,并使用从在线JSON数据中读取的内容创建一个新对象。我学习的方法是将其作为NSData读入,然后将其转换为字典。但我在将NSData转换为字典时遇到了问题。该程序的想法是能够加载有关团队成员不同统计信息,并在表视图中显示它们。 - Totals
啊,好的...你的JSON缺少结束位,但我会尽力处理... - Daniel T.
我已经解决了这个问题。只是我没有使用正确的语法,但是答案是。如果让字典= NSJSONSerialization.JSONObjectWithData(urlData,options:nil,error:&error)as?Dictionary <String,AnyObject>它将把nsdata转换为字典。 - Totals
1
你应该将解决方案作为单独的答案添加,并标记为已接受,以便人们不会浪费时间尝试回答它... - Tommie C.
显示剩余4条评论
1个回答

2

我知道这个问题使用的是Swift 2,但由于没有答案而且每个人都应该使用Swift 3,所以这里提供Swift 3的解决方案。

func preloadData(){

    func failed(msg: String){

        let alert = UIAlertController(title: "Error", message: msg, preferredStyle: .alert)

        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))

        self.addChildViewController(alert)
    }

    guard let navigationController = self.window!.rootViewController as? UINavigationController else { failed(msg: "The root view controller is not a UINavigationController"); return }

    guard let masterController = navigationController.childViewControllers[0] as? PlayerViewController else { failed(msg: "There is no PlayerViewController"); return }

    guard let url = URL(string: "Whatever your URL is") else { failed(msg: "This is an invalid URL"); return }

    guard let contents = try? Data(contentsOf: url) else { failed(msg: "Cannot retrieve data from this URL"); return }

    guard let json = try? JSONSerialization.jsonObject(with: contents, options: .mutableContainers) else { failed(msg: "Contents is not in JSON format."); return }

    guard let dict = json as? Dictionary<String,Any> else { failed(msg: "Cannot convert JSON to dictionary."); return }

    guard let players = dict["Players"] as? Array<Dictionary<String,String>> else { failed(msg: "There is no players."); return }

    for player in players {

        guard
            let firstName   = player["First Name"],
            let lastName    = player["Last Name"],
            let position    = player["Position"],
            let bats        = player["Bats"],
            let _throws     = player["Throws"],
            let height      = player["Height"],
            let weight      = player["Weight"],
            let dob         = player["DOB"],
            let number      = player["Number"] else { continue }

        masterController.objects.append(Player(firstName: firstName, lastName: lastName, position: position, bats: bats, throws: _throws, height: height, weight: weight, dob: dob, number: number))

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接