在swift中读取一个json文件

时间:2015-02-05 21:21:53

标签: json xcode swift

大家好我在我的swift项目中有一个json文件,我想阅读这个文件并使用它的内容来绘制东西。我创建了一个控制器,我有以下内容。

import UIKit

class MapViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let jsonData = getJSON("hls.json")

        println(jsonData)

        let jsonDataResult = parseJSON(jsonData)

        println("\(jsonDataResult)")
    }

    func getJSON(urlToRequest: String) -> NSData{
        return NSData(contentsOfURL: NSURL(string: urlToRequest)!)!
    }

    func parseJSON(inputData: NSData) -> NSDictionary{
        var error: NSError?
        var boardsDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary

        return boardsDictionary
    }
}

不幸的是它说:致命错误:在getJSOn函数中解包一个Optional值时意外地发现了nil。我的应用程序目录中有一个名为hls.json的文件,我的所有swift文件都是如此,所以我不知道它是不是因为它无法读取它或者是什么...希望有人可以帮助我!

2 个答案:

答案 0 :(得分:1)

我也是JSON的新手。但是,我想我知道问题是什么。您说您正在尝试在 app目录中读取名为hls.json的文件,但查看您的getJSON函数表明您正在尝试从Internet获取数据。

(如果我错了,请纠正我)我相信你现在正在做的是尝试从名为“hls.json”的网站获取JSON数据,而不是试图访问计算机中的文件。

因为不存在网址为“hls.json”的网站,调用getJSON(“hls.json”)将始终返回nil。

解决这个问题的方法是使用

let filePath = NSBundle.mainBundle().pathForResource("hls",ofType:"json")

然后使用

if let data = NSData(contentsOfFile:filePath!, options: NSDataReadingOptions.DataReadingUncached, error:&readError) { success(data: data) }

充当您为解析JSON所做的数据。

希望有所帮助。再说一遍,我也是新人,所以我不是很确定; P

答案 1 :(得分:1)

您正在使用getJSON()中的感叹号展开nil。这是因为你的NSURL可能因为它的创建方式而为零。

您可能需要更改getJSON()功能以正确获取文件的网址,如下所示:

func getJSON(fileName: String, extn: String) -> NSData?
{
    if let fileURL = NSBundle.mainBundle().URLForResource(fileName, withExtension: extn) {
        if let data = NSData(contentsOfURL: fileURL) {
            return data
        }
    }
    return nil
}

请注意,此函数可能返回nil。因此,返回签名为NSData?

因此,您需要打开NSData?来自getJSON功能的parseJSON才能调用parseJSON函数,因为NSData采用非可选if let作为论点。

解包可以使用另一个override func viewDidLoad() { super.viewDidLoad() if let jsonData = getJSON("hls", "json") { println(jsonData) let jsonDataResult = parseJSON(jsonData) println("\(jsonDataResult)") } } 语句完成,如下所示:

getJSON()

由于问题是关于parseJSON()上的nil解包错误,我没有看到{{1}}函数的正确性。