NBA统计数据JSON解析斯威夫特

时间:2018-03-23 07:35:19

标签: ios json swift swift4

有人可以帮助我解析这个以获取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...

*欢迎统计分析师;)

3 个答案:

答案 0 :(得分:1)

我在邮递员中运行你的网址请求..你有三把钥匙..

使用swiftyJson提取值,如下所示:

var resourceString = json["resource"].stringValue

var resultSets = json["resultSets"].arrayValue

enter image description here

所以你可以像这样继续

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将包含与标题

中的每个键对应的所有值

答案 1 :(得分: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)
    }
}

您可以将任何团队名称和任何stadistic传递给此方法

勇士和WinPCT的示例

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

<强>输出

  

“0.746”

其他输入和输出

  

输入 teamName:“勇士”,stadisticsName:“TeamCity”输出“金州”

     

输入 teamName:“勇士”,stadisticsName:“LongHomeStreak”输出“8”

     

输入 teamName:“Pistons”,stadisticsName:“WinPCT”输出“0.444”

答案 2 :(得分:0)

这是方法:

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)
    }

<强> EDITED 她是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)

注意:标题中的键索引和此数组中的值相同。示例: - TeamName位于标题数组中的第4个位置,"Warriors"位于teamInfo的第4个位置,因此您可以通过索引获得所需的任何内容。