如何解决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
当我打印变量 $queryResult 和 $queryResult 时,我不明白为什么 rank 从 4690 变为 1 .leaderboard 内容清楚地显示 rank=4690,但是当我访问最里面的元素时,它会打印 rank: 1。
为什么排名从 4690 变为 1?
你可以复制代码自己试试,API是公开的。
谢谢
解决方法
iRon 提供了关键指针:因为 $queryResult.leaderboard
是一个 数组,本身有一个 .Rank
属性,您必须显式访问感兴趣的元素以获取它们的 .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
的数组,或者您可以从 for-display 表示中推断它: {...}
中的 outer {@{profile_id=518981; ..}}
表示该值是一个 集合(尽管不一定是 数组)。
此显式元素访问 ([0]
) 对于您的其他属性来说不是必需的,原因在于一个名为 {{3 }}:
-
它允许您方便地对 集合 使用属性访问,以便返回其 元素 的属性值:
-
对于 multi 元素集合,元素的属性值作为 array (
[object[]]
) 返回,但是 - 就像在管道 - 对于单元素集合,唯一元素的属性值按原样返回。 -
因此,例如,给定一个对象
$obj = [pscustomobject] @{ profile_id = 518981 }
:-
单元素 case:
@($obj).profile_id
实际上等同于:@($obj)[0].profile_id
/$obj.profile_id
-
多元素 case:
@($obj,$obj).profile_id
实际上等同于:$obj | ForEach-Object { $_.profile_id }
-
单元素 case:
-
-
但是,如果集合本身具有给定名称的属性,则该集合级别的属性优先 - 即
.Rank
发生了什么。-
member enumeration 讨论了这种情境歧义,并建议引入一个专用运算符,比如
%.
,以便您可以明确地请求任一常规属性访问或成员枚举。 -
作为比使用 GitHub issue #7445 或
ForEach-Object
更快的一般解决方法,您可以使用.ForEach('rank')
,如{{ 3}}。
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。