大家好我在我的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文件都是如此,所以我不知道它是不是因为它无法读取它或者是什么...希望有人可以帮助我!
答案 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}}函数的正确性。