Powershell - 如何检索 Object[] 数据
Powershell - How to retrieve Object[] data
我正在尝试从 api 请求中获取一些数据,但是 运行k 它正在获取损坏。
我在一个文件中有这段代码:
$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
我不明白为什么 运行k 当我打印变量 $queryResult 和 $queryResult.leaderboard 内容清楚地表明 运行k=4690,但是当我访问它打印的最里面的元素时运行k: 1.
为什么运行k从4690变成1?
你可以复制代码自己试试,API就是public。
谢谢
iRon has provided the crucial pointer: Because $queryResult.leaderboard
is an array, which itself has a .Rank
属性,您必须显式访问感兴趣的元素才能获得 它们的 .rank
属性 value(注意 属性 访问在 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; ..}}
中的 outer {...}
表示该值是一个 collection (虽然不是必须是 数组 ).
您的 other 不需要此显式元素访问 ([0]
) 的原因properties 是由于名为 member-access enumeration:
的功能
它允许您方便地使用 属性 访问 集合 以获得其 [=] 的 属性 值54=]元素 返回:
对于 multi 元素集合,元素的 属性 值作为 array ([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 }
但是,如果集合 本身 具有给定名称的 属性,则该 集合-level 属性 优先 - 这就是 .Rank
.
发生的情况
GitHub issue #7445 讨论了这种情况的歧义,并提议引入一个 专用运算符 ,例如 %.
以便您可以明确地请求 常规 属性 访问 或 成员访问枚举。
作为 一般解决方法,比使用 ForEach-Object
or Select-Object
, you can use .ForEach('rank')
, as discussed in this answer.
更快
我正在尝试从 api 请求中获取一些数据,但是 运行k 它正在获取损坏。 我在一个文件中有这段代码:
$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
我不明白为什么 运行k 当我打印变量 $queryResult 和 $queryResult.leaderboard 内容清楚地表明 运行k=4690,但是当我访问它打印的最里面的元素时运行k: 1.
为什么运行k从4690变成1?
你可以复制代码自己试试,API就是public。
谢谢
iRon has provided the crucial pointer: Because $queryResult.leaderboard
is an array, which itself has a .Rank
属性,您必须显式访问感兴趣的元素才能获得 它们的 .rank
属性 value(注意 属性 访问在 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; ..}}
中的 outer {...}
表示该值是一个 collection (虽然不是必须是 数组 ).
您的 other 不需要此显式元素访问 ([0]
) 的原因properties 是由于名为 member-access enumeration:
它允许您方便地使用 属性 访问 集合 以获得其 [=] 的 属性 值54=]元素 返回:
对于 multi 元素集合,元素的 属性 值作为 array (
[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 }
- 单元素 案例:
但是,如果集合 本身 具有给定名称的 属性,则该 集合-level 属性 优先 - 这就是
发生的情况.Rank
.GitHub issue #7445 讨论了这种情况的歧义,并提议引入一个 专用运算符 ,例如
%.
以便您可以明确地请求 常规 属性 访问 或 成员访问枚举。作为 一般解决方法,比使用
更快ForEach-Object
orSelect-Object
, you can use.ForEach('rank')
, as discussed in this answer.