NBA Stats JSON 解析 Swift

Posted

技术标签:

【中文标题】NBA Stats JSON 解析 Swift【英文标题】:NBA Stats JSON Parsing Swift 【发布时间】:2018-03-23 07:35:18 【问题描述】:

谁能帮我解析这个以在 Swift 4 中获取数据。我不确定如何使用 SwiftyJSON 解析这样的数据。

http://stats.nba.com/stats/leaguestandingsv3?LeagueID=00&Season=2017-18&SeasonType=Regular+Season

例如:打印勇士队的“WinPCT”

import SwiftyJSON

var nbaData: Data!

    let url = URL(string: "http://stats.nba.com/stats/leaguestandingsv3?LeagueID=00&Season=2017-18&SeasonType=Regular+Season")

    do 
        nbaData = try Data(contentsOf: url!)

            let json = try JSON(data: nbaData)

                //json["WinPCT"]["Warriors"] something like this


     catch 
        print(error)
    

试图用数据完成类似的事情。 打印勇士的胜率

for item in json["resultSets"].arrayValue 

print(item["Warriors/WinPTC"].stringValue)


我只想获取特定团队的行集 [ ] 中的所有数据,并一一挑选这些数据,例如排名、胜利、失败等。

例如:

let warriorsRecord = json["Warriors"]["WarriorsRecord"]
let warriorsWins = json["Warriors"]["Wins"]
let warriorsLosses = json["Warriors"]["Losses"]
//etc...

*欢迎您的统计分析师 ;)

【问题讨论】:

你的问题还是不够清楚。 WinPTCheaders 中,WarriorsrowSet 中。 b/w两者的关系是什么? OK 那么勇士队的当前记录呢。 我只想获取特定团队的行集 [ ] 中的所有数据,并一一挑选这些数据,例如排名、胜利、失败等... @husharoonie 试试我的答案,它有效 @husharoonie 查看我回答的编辑部分。它干净而简短。 【参考方案1】:

您请求的 JSON 会带来一个带有参数的数组和另一个带有数据的数组,因此您需要找到您请求的统计数据的索引并在数据数组中搜索该索引,

您只需向他们传递所需的参数

给你

func getStadisticsFromTeam(jsonObject:JSON,teamName:String,stadisticsName:String,closure:@escaping (String?)->Void) 
    let resultSetsDict = jsonObject["resultSets"][0]
    var stadisticsIndex = -1
    var nameIndex = -1
    if let arrayOFHeaders = resultSetsDict["headers"].array 
        for (index,value) in arrayOFHeaders.enumerated() 
            if(value.stringValue == stadisticsName) 
                stadisticsIndex = index
            
            if(value.stringValue == "TeamName") 
                nameIndex = index
            
        
    
    if(stadisticsIndex == -1 || nameIndex == -1) 
        closure(nil)
    
    
    if let resultRows = resultSetsDict["rowSet"].array 
        let warriorsData = resultRows.filter($0.array![nameIndex].stringValue == teamName)
        let desiredValue = warriorsData[0].array![stadisticsIndex].stringValue
        closure(desiredValue)
    


func loadStaticsReportData(teamName:String,stadisticsName:String,closure:@escaping (String?)->Void)

    let url = URL(string: "http://stats.nba.com/stats/leaguestandingsv3?LeagueID=00&Season=2017-18&SeasonType=Regular+Season")
    
    do 
        let nbaData = try Data(contentsOf: url!)
        
        let json = try JSON(data: nbaData)
        
        self.getStadisticsFromTeam(jsonObject: json, teamName: teamName, stadisticsName: stadisticsName, closure: closure)
        //json["WinPCT"]["Warriors"] something like this
        
     catch 
        print(error)
    

您可以将任何团队名称和任何统计数据传递给此方法

Warriors 和 WinPCT 示例

    self.loadStaticsReportData(teamName: "Warriors", stadisticsName: "WinPCT")  (value) in
        if(value != nil) 
        debugPrint(value)
        
    

输出

“0.746”

其他输入和输出

输入 teamName:“Warriors”,stadisticsName:“TeamCity”输出“Golden State”

输入 teamName:“Warriors”,stadisticsName:“LongHomeStreak”输出“8”

输入 teamName:“活塞”,stadisticsName:“WinPCT”输出“0.444”

【讨论】:

【参考方案2】:

我在邮递员中运行了你的 url 请求..你有三个键..

您可以像这样使用 swiftyJson 提取值:

var resourceString = json["resource"].stringValue

var resultSets = json["resultSets"].arrayValue

这样你就可以继续下去了

var resultDictionary = resultSets[0].dictionaryValue
var rowSetArray = resultDictionary["rowSet"].arrayValue

现在您的 rewSetArray 包含详细信息数组,其中每个元素对应于对应于一个团队的详细信息。 您可以为每个团队创建一个模式类,并将数据保存在该模型类中,并将标题作为类变量..

然后为 rowSetArray 上的每个循环运行

var teamInfoDict = [[String: Any]]()

for row in rowSetArray 

    var headersArray = resultDictionary["headers"].arrayValue
    var teamDict = [String: Any]()
    var count = 0
    for header in headersArray 
        teamDict[header.stringValue] = row.arrayValue[count]
        count += 1
    

    teamInfoDict.append(teamDict)

此时,teamInfoDict 将拥有与标题中每个键对应的所有值

【讨论】:

我明白,但我怎样才能得到 //json["WinPCT"]["Warriors"] 这样的东西。勇士的胜率?【参考方案3】:

方法如下:

let url = URL(string: "http://stats.nba.com/stats/leaguestandingsv3?LeagueID=00&Season=2017-18&SeasonType=Regular+Season")

    do 
        let data = try Data(contentsOf: url!)
        let json = try JSON(data: data)

        let headers = json["resultSets"][0]["headers"]
        let rowSet = json["resultSets"][0]["rowSet"]

        /// rowSet is an array
        var teamInfo: JSON?
        for (index, teamJson):(String, JSON) in rowSet 
            // Do something you want

            /// Get team sho has name "Warriors"
            if teamJson.arrayValue[4].stringValue == "Warriors" 
                teamInfo = teamJson
                break
            

            if teamInfo != nil 
                break
            
        

        // Here is information of Team "Warriors". 
        print(teamInfo?.arrayValue)

        /// And here is the `WinPCT` which is at 14th position in `headers` 
        print(tempInfo?.arrayValue[14].stringValue)

     catch 
        print(error)
    

已编辑 她的方法是Swift 聪明的方式。

/// 4 is the Index of `TeamName` in headers. By same way you can filter other things too.
let teamInfo = rowSet.filter($0.1.arrayValue[4].rawString() == "Warriors")
print(teamInfo.first?.1.arrayValue)

/// `WinPCT` which is at 14th position in `headers`
print(teamInfo.first?.1.arrayValue[14].stringValue)

注意: headers中key的索引和这个数组中的value是一样的。示例:- TeamName 位于 headers 数组的第 4 位,"Warriors" 位于 teamInfo 的第 4 位,因此您可以通过索引获得所需的任何内容。

【讨论】:

以上是关于NBA Stats JSON 解析 Swift的主要内容,如果未能解决你的问题,请参考以下文章

爬虫简单入门-接口寻找调用

python 从stats.nba.com中删除NBA球员统计数据

python 从stats.nba.com中删除NBA球员统计数据

解析 JSON Swift 4

用 Swift 解析 JSON

JSON 解析 Swift 4