有人可以帮助我解析这个以获取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...
*欢迎统计分析师;)
答案 0 :(得分:1)
我在邮递员中运行你的网址请求..你有三把钥匙..
使用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将包含与标题
中的每个键对应的所有值答案 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个位置,因此您可以通过索引获得所需的任何内容。