Powershell - Как получить данные Object[]
Я пытаюсь получить данные из запроса api, но оцениваю , что они повреждены. У меня есть этот код в файле:
$queryResult=Invoke-restmethod -Uri "https://aoe2.net/api/leaderboard?game=aoe2de&leaderboard_id=3&steam_id=76561198011209758"
Write-Output "COMPLETE RETURN"
$queryResult
Write-Output "LEADERBOARD"
$queryResult.leaderboard
Write-Output "INDIVIDUAL ITEMS"
Write-Output $("profile_id: "+$queryResult.leaderboard.profile_id)
Write-Output $("rank: "+$queryResult.leaderboard.rank)
Write-Output $("rating: "+$queryResult.leaderboard.rating)
Write-Output $("steam_id: "+$queryResult.leaderboard.steam_id)
Write-Output $("icon: "+$queryResult.leaderboard.icon)
Write-Output $("name: "+$queryResult.leaderboard.name)
Write-Output $("clan: "+$queryResult.leaderboard.clan)
Write-Output $("country: "+$queryResult.leaderboard.country)
Write-Output $("previous_rating: "+$queryResult.leaderboard.previous_rating)
Write-Output $("highest_rating: "+$queryResult.leaderboard.highest_rating)
Write-Output $("streak: "+$queryResult.leaderboard.streak)
Write-Output $("lowest_streak: "+$queryResult.leaderboard.lowest_streak)
Write-Output $("highest_streak: "+$queryResult.leaderboard.highest_streak)
Write-Output $("games: "+$queryResult.leaderboard.games)
Write-Output $("wins: "+$queryResult.leaderboard.wins)
Write-Output $("losses: "+$queryResult.leaderboard.losses)
Write-Output $("drops: "+$queryResult.leaderboard.drops)
Write-Output $("last_match: "+$queryResult.leaderboard.last_match)
Write-Output $("last_match_time: "+$queryResult.leaderboard.last_match_time)
Всякий раз, когда я его запускал, он показывает:
COMPLETE RETURN
total : 50403
leaderboard_id : 3
start : 1
count : 1
leaderboard : {@{profile_id=518981; rank=4690; rating=1414; steam_id=76561198011209758; icon=; name=[LdS]Nestoter; clan=LDS14; country=UY; previous_rating=1398; highest_rating=1432; streak=1; lowest_streak=-10; highest_streak=8;
games=141; wins=80; losses=61; drops=1; last_match=1619919442; last_match_time=1619919442}}
LEADERBOARD
profile_id : 518981
rank : 4690
rating : 1414
steam_id : 76561198011209758
icon :
name : [LdS]Nestoter
clan : LDS14
country : UY
previous_rating : 1398
highest_rating : 1432
streak : 1
lowest_streak : -10
highest_streak : 8
games : 141
wins : 80
losses : 61
drops : 1
last_match : 1619919442
last_match_time : 1619919442
INDIVIDUAL ITEMS
profile_id: 518981
rank: 1
rating: 1414
steam_id: 76561198011209758
icon:
name: [LdS]Nestoter
clan: LDS14
country: UY
previous_rating: 1398
highest_rating: 1432
streak: 1
lowest_streak: -10
highest_streak: 8
games: 141
wins: 80
losses: 61
drops: 1
last_match: 1619919442
last_match_time: 1619919442
Я не понимаю, почему ранг меняется с 4690 на 1, когда я печатаю содержимое переменных $ queryResult и $ queryResult.leaderboard, он ясно показывает, что rank = 4690, но когда я обращаюсь к самому внутреннему элементу, он печатает rank: 1.
Почему ранг меняется с 4690 на 1?
Вы можете скопировать код и попробовать себя, API общедоступный.
Спасибо
1 ответ
iRon предоставил ключевой указатель: потому что это массив , который сам имеет свойство, вы должны явно получить доступ к интересующим элементам, чтобы получить их
.rank
значение свойства (обратите внимание, что доступ к свойствам в PowerShell нечувствителен к регистру , как это обычно бывает в PowerShell):
# Note the [0] for access to the 1st element.
$queryResult.leaderboard[0].rank # -> 4690
Вы можете определить, что
$queryResult.leaderboard
это массив с
$queryResult.leaderboard | Get-Member
или же
$queryResult.leaderboard.GetType().Name
, или вы можете вывести это из представления для отображения: внешний
{...}
в
{@{profile_id=518981; ..}}
указывает, что значение является коллекцией (хотя и не обязательно массивом ).
Причина этого явного доступа к элементу (
[0]
) не требуется для других ваших свойств из-за функции, называемой перечислением членов :
Он позволяет удобно использовать доступ к свойствам коллекции , чтобы возвращать значения свойств ее элементов :
В многоэлементной коллекции значения свойств элементов возвращаются в виде массива (
[object[]]
), но - как и в конвейере - для одноэлементной коллекции значение свойства единственного элемента возвращается как есть.Поэтому, например, для данного объекта
$obj = [pscustomobject] @{ profile_id = 518981 }
:- Одноэлементный корпус:
@($obj).profile_id
фактически то же самое, что:
@($obj)[0].profile_id
/$obj.profile_id
- Многоэлементный корпус:
@($obj, $obj).profile_id
фактически то же самое, что:
$obj | ForEach-Object { $_.profile_id }
- Одноэлементный корпус:
Однако, если коллекция сам имеет свойство с заданным именем, что свойство коллекции уровня имеет преимущество - что то , что случилось с
.Rank
.В выпуске GitHub № 7445 обсуждается эта ситуационная неоднозначность и предлагается ввести специального оператора , например
%.
так что вы можете однозначно запросить либо обычный доступ к свойству, либо перечисление членов.В качестве общего обходного пути, который быстрее, чем использование
ForEach-Object
или жеSelect-Object
, ты можешь использовать.ForEach('rank')
, как описано в этом ответе .