快速读取JSON文件
我是Swift新手-尝试从URL读取JSON文件。下面是我的尝试 JSON看起来是有效的——我用JSONLint测试了它,但它一直崩溃 想法快速读取JSON文件,json,swift,Json,Swift,我是Swift新手-尝试从URL读取JSON文件。下面是我的尝试 JSON看起来是有效的——我用JSONLint测试了它,但它一直崩溃 想法 func getRemoteJsonFile() -> NSDictionary { //Create a new url let remoteUrl:NSURL? = NSURL(string: "http://nfl-api.azurewebsites.net/myplayers.json") //check if i
func getRemoteJsonFile() -> NSDictionary {
//Create a new url
let remoteUrl:NSURL? = NSURL(string: "http://nfl-api.azurewebsites.net/myplayers.json")
//check if its nil
if let actualRemoteUrl = remoteUrl {
//try to get the data
let filedata:NSData? = NSData(contentsOfURL: actualRemoteUrl)
//check if its nil
if let actualFileData = filedata {
//parse out the dictionaries
let jsonDict = NSJSONSerialization.JSONObjectWithData(actualFileData, options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary
return jsonDict
}
}
return NSDictionary()
}
使用以下命令更新代码:
func getRemoteJsonFile() -> [NSDictionary] {
// Create a new URL
let remoteUrl:NSURL? = NSURL(string: "http://nfl-api.azurewebsites.net/myplayers.json")
let urlString:String = "\(remoteUrl)"
// Check if it's nil
if let actualRemoteUrl = remoteUrl {
// Try to get the data
let fileData:NSData? = NSData(contentsOfURL: actualRemoteUrl)
// Check if it's nil
if let actualFileData = fileData {
// Parse out the dictionaries
let arrayOfDictionaries:[NSDictionary]? = NSJSONSerialization.JSONObjectWithData(actualFileData, options: NSJSONReadingOptions.MutableContainers, error: nil) as [NSDictionary]?
if let actualArrayOfDictionaries = arrayOfDictionaries {
// Successfully parsed out array of dictionaries
return actualArrayOfDictionaries
}
}
}
return [NSDictionary]()
}
这对我来说很好。我花了一秒钟才弄明白,所以我不怪你错过了它 您链接到的JSON已缩小,因此很难看到其结构。让我们看一看它的片段()。
[
{
“玩家ID”:2501863,
“玩家名称”:“佩顿·曼宁”,
“玩家团队”:“兽穴”,
“播放位置”:“QB”,
“游戏者公园”:4727,
“PlayerPassingTDs”:39,
“PlayerInterceptions”:15,
“游戏者游乐场”:-24,
“PlayerRushingDS”:0,
“玩家接收码”:0,
“PlayerReceivingTDs”:0,
“PlayerReturnYards”:0,
“PlayerReturnTDs”:0,
“PlayerFunblets”:0,
“PlayerTwoPointConversions”:2,
“玩家迷路”:2,
“PlayerTeamLogo”:http://i.nflcdn.com/static/site/7.0/img/logos/teams-gloss-81x54/den.png"
}
]
嗯。它用括号括起来,这意味着它是一个数组
它是一个数组,因此不能将其强制转换为NSDictionary
。相反,您可以将其转换为NSArray
,但为什么不使用本机Swift类型呢
如果你不喜欢类型,你会发现,但我仍然认为这是一个更好的方法,因为它迫使你考虑你正在解析的数据
我们有这个函数类型定义的第一部分;它是一个数组([]
)。我们的阵列由哪些组件组成?我们可以使用一个简单的NSDictionary
,但是我们在这里使用的是完整的本机类型,所以让我们使用
为此,我们必须知道字典的类型(本机字典类型的语法是[KeyType:ValueType]
)。检查JSON显示所有键都是String
s,但值的类型不同,因此我们可以使用AnyObject
这给了我们一个字典类型[String:AnyObject]
,我们的整个JSON就是这个类型的数组,所以最后的类型是[[String:AnyObject]]]
(哇)
现在我们有了正确的类型,我们可以稍微修改一下用于解析JSON的函数 首先,让我们将新类型用于返回值和强制转换值。然后,让我们创建一个返回类型,以防出现错误,并添加一个
error
变量来记录它
清理后的函数如下所示:
if let data: [[String: AnyObject]] = getData() {
println(data[0]["PlayerName"]!) // Peyton Manning
}
func getData()->[[String:AnyObject]]?{
让数据:NSData?=NSData(内容URL:NSURL(字符串):http://nfl-api.azurewebsites.net/myplayers.json")!)
如果let req:NSData=data{
var错误:N错误?
如果将JSON:[[String:AnyObject]]=NSJSONSerialization.JSONObjectWithData(请求,选项:NSJSONReadingOptions.AllowFragments,错误:&error)设为?[[String:AnyObject]]{
返回JSON
}
}
归零
}
就这样
我们现在可以调用函数并从[[String:AnyObject]]
(同样,哇)中提取值,如下所示:
if let data: [[String: AnyObject]] = getData() {
println(data[0]["PlayerName"]!) // Peyton Manning
}
错误消息是什么?线程1:EXC_BAD_ACCESS(code=2,address=0x102475138)您听说过optionals吗?为什么不使用SwiftyJSON来代替NSDictionary?很高兴帮助您……:)请在评论中提及您为什么否决我的答案。这应该是正确的答案。写得很漂亮。