我正在尝试从此 JSON 链接获取 NHL 的所有 31 支球队。下面是该文件的外观:
{
"sports":[
{
"name":"hockey",
"slug":"hockey",
"id":70,
"uid":"s:70",
"leagues":[
{
"name":"National Hockey League",
"slug":"nhl",
"abbreviation":"nhl",
"id":90,
"uid":"s:70~l:90",
"groupId":9,
"shortName":"NHL",
"teams":[
{
...team info....
}......
我目前在函数中有这个 do 语句,试图循环遍历“teams”数组中的所有 31 个条目:
if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary {
if let entries: NSArray = parsedData["sports"] as! NSArray {
for entry in entries {
//work with data
}
}
}
我知道我必须在“if letentries”行上更深入地挖掘,但我似乎无法获得我想要的数据。提前致谢。
最佳答案
首先,为什么这么多教程建议/人们使用 .mutableContainers
尽管该对象永远不会发生变化,并且具有讽刺意味的是,结果大多分配给 im 可变对象?
不要这样做。通过省略参数来传递无选项。
其次,不要对抗 Swift 的强类型系统。使用原生集合类型 Array
和 Dictionary
,并且不要注释编译器可以推断的类型。
为了方便起见,让我们创建一个类型别名:
typealias JSONDictionary = [String:Any]
if let parsedData = try JSONSerialization.jsonObject(with: data!) as? JSONDictionary,
键sports
的值是一个数组(由[]
表示)
let sports = parsedData["sports"] as? [JSONDictionary] {
枚举数组并获取键leagues
的值,它也是一个数组
for sport in sports {
print("sport ", sport["name"] as? String ?? "n/a")
if let leagues = sport["leagues"] as? [JSONDictionary] {
对联赛
执行相同操作并获取团队
for league in leagues {
print("league ", league["name"] as? String ?? "n/a")
if let teams = league["teams"] as? [JSONDictionary] {
for team in teams {
解析 JSON 非常简单,只有两种集合类型和四种值类型。
}
}
}
}
}
}
关于json - 解析 JSON Swift 3 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46010620/