Я пытаюсь декодировать JSON, полученный от сетевого запроса, но он декодирует только первый объект.JSON выглядит следующим образом
{
"lastUpdatedOn": "2018-08-21T14:38:38.251Z",
"players": [
{
"player": {
"id": 10138,
"firstName": "Alex",
"lastName": "Abrines",
"primaryPosition": "SG",
"alternatePositions": [],
"jerseyNumber": 8,
"currentTeam": {
"id": 96,
"abbreviation": "OKL"
},
"currentRosterStatus": "ROSTER",
"currentInjury": null,
"height": "6'6\"",
"weight": 190,
"birthDate": "1993-08-01",
"age": 25,
"birthCity": "Palma de Mallorca",
"birthCountry": "Spain",
"rookie": false,
"highSchool": null,
"college": null,
"handedness": {
"shoots": "R"
},
"officialImageSrc": "https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/203518.png",
"socialMediaAccounts": [],
"currentContractYear": null,
"drafted": {
"year": 2013,
"team": {
"id": 96,
"abbreviation": "OKL"
},
"pickTeam": {
"id": 96,
"abbreviation": "OKL"
},
"round": 2,
"roundPick": 2,
"overallPick": 32
},
"externalMappings": [
{
"source": "NBA.com",
"id": 203518
}
]
},
"teamAsOfDate": {
"id": 96,
"abbreviation": "OKL"
}
},
{
"player": {
"id": 9466,
"firstName": "Quincy",
"lastName": "Acy",
"primaryPosition": "PF",
"alternatePositions": [],
"jerseyNumber": 13,
"currentTeam": {
"id": 84,
"abbreviation": "BRO"
},
"currentRosterStatus": "ROSTER",
"currentInjury": null,
"height": "6'7\"",
"weight": 240,
"birthDate": "1990-10-06",
"age": 27,
"birthCity": "Tyler, TX",
"birthCountry": "USA",
"rookie": false,
"highSchool": "Mesquite Horn",
"college": "Baylor University",
"handedness": {
"shoots": "R"
},
"officialImageSrc": "https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/203112.png",
"socialMediaAccounts": [
{
"mediaType": "TWITTER",
"value": "QuincyAcy"
}
],
"currentContractYear": {
"seasonStartYear": 2017,
"baseSalary": 1709538,
"minorsSalary": 0,
"signingBonus": 0,
"otherBonuses": 0,
"capHit": 1709538,
"fullNoTradeClause": false,
"modifiedNoTradeClause": false,
"noMovementClause": false,
"overallContract": {
"signingTeam": {
"id": 84,
"abbreviation": "BRO"
},
"signedOn": null,
"totalYears": 2,
"totalSalary": 3499630,
"totalBonuses": 0,
"expiryStatus": "UFA",
"annualAverageSalary": 1749815
}
},
"drafted": {
"year": 2012,
"team": {
"id": 81,
"abbreviation": "TOR"
},
"pickTeam": {
"id": 81,
"abbreviation": "TOR"
},
"round": 2,
"roundPick": 7,
"overallPick": 37
},
"externalMappings": [
{
"source": "NBA.com",
"id": 203112
}
]
},
"teamAsOfDate": {
"id": 84,
"abbreviation": "BRO"
}
},
{
"player": {
"id": 9301,
"firstName": "Jordan",
"lastName": "Adams",
"primaryPosition": "SG",
"alternatePositions": [],
"jerseyNumber": 3,
"currentTeam": null,
"currentRosterStatus": "RETIRED",
"currentInjury": null,
"height": "6'5\"",
"weight": 209,
"birthDate": "1994-07-08",
"age": 24,
"birthCity": "Atlanta, GA",
"birthCountry": "USA",
"rookie": false,
"highSchool": "Oak Hill Academy",
"college": "University of California, Los Angeles",
"handedness": {
"shoots": "R"
},
"officialImageSrc": "https://ak-static.cms.nba.com/wp-content/uploads/headshots/nba/latest/260x190/203919.png",
"socialMediaAccounts": [
{
"mediaType": "TWITTER",
"value": "jordanadams1231"
}
],
"currentContractYear": null,
"drafted": {
"year": 2014,
"team": {
"id": 107,
"abbreviation": "MEM"
},
"pickTeam": {
"id": 107,
"abbreviation": "MEM"
},
"round": 1,
"roundPick": 22,
"overallPick": 22
},
"externalMappings": [
{
"source": "NBA.com",
"id": 203919
}
]
},
"teamAsOfDate": null
}
],
"references": {
"teamReferences": [
{
"id": 84,
"city": "Brooklyn",
"name": "Nets",
"abbreviation": "BRO",
"homeVenue": {
"id": 78,
"name": "Barclays Center"
},
"teamColoursHex": [],
"socialMediaAccounts": [],
"officialLogoImageSrc": null
},
{
"id": 96,
"city": "Oklahoma City",
"name": "Thunder",
"abbreviation": "OKL",
"homeVenue": {
"id": 90,
"name": "Chesapeake Energy Arena"
},
"teamColoursHex": [],
"socialMediaAccounts": [],
"officialLogoImageSrc": null
}
]
}
}
Моя структура в настоящее время выглядит следующим образом, и я пытаюсь использовать пользовательский декодер, я смог заставить его работать, используя вложенные структуры, но затем я должен перебрать декодированные данныеи добавить всех игроков в массив.
struct Player: Codable {
let firstName: String
let lastName: String
enum RootKeys: String, CodingKey {
case players
}
enum PlayerKeys: String, CodingKey {
case player
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: RootKeys.self)
var playersUnkeyedContainer = try container.nestedUnkeyedContainer(forKey: .players)
let playersContainer = try playersUnkeyedContainer.nestedContainer(keyedBy: PlayerKeys.self)
let playerContainer = try playersContainer.nestedContainer(keyedBy: Player.CodingKeys.self, forKey: .player)
firstName = try playerContainer.decode(String.self, forKey: .firstName)
lastName = try playerContainer.decode(String.self, forKey: .lastName)
}
}
Когда я пытаюсь сделать это
let decodedPlayers = try jsonDecoder.decode(Player.self, from: data)
Это работает, но decodedPlayers - только один Player, и если я пытаюсь сделать это:
let decodedPlayers = try jsonDecoder.decode([Player].self, from: data)
Я получаю это сообщение об ошибке: «Предполагается, что декодируется массив, но вместо этого найден словарь».