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...
*欢迎您的统计分析师 ;)
【问题讨论】:
你的问题还是不够清楚。WinPTC
在 headers
中,Warriors
在 rowSet
中。 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球员统计数据