快速读取JSON文件

快速读取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

我是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 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?很高兴帮助您……:)请在评论中提及您为什么否决我的答案。这应该是正确的答案。写得很漂亮。