我正在编写需要解除序列化JSON以与GitHub API进行通信的PowerShell代码。以下是我的代码片段:
# Grab the latest release from GitHub
$response = Invoke-WebRequest 'https://api.github.com/repos/jamesqo/Emptify/releases'
$releases = $response.Content | ConvertFrom-Json
$latest = $releases[0]
$urls = $latest.assets | Select { $_.browser_download_url }
虽然我能够在运行代码段后成功从JSON中提取我需要的值,但它们存储在' $_.browser_download_url '
的一些奇怪的属性名称下,这似乎是里面的代码我的Select
块。例如,这里是$urls | Get-Member
:
TypeName: Selected.System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
$_.browser_download_url NoteProperty System.String $_.browser_download_url =https://github.com/jamesqo/Emptify/re... # ???
这是我从运行$urls | ConvertTo-Json
获得的输出:
[
{
" $_.browser_download_url ": "https://github.com/jamesqo/Emptify/releases/download/1.0/Emptify.Win32.zip"
},
{
" $_.browser_download_url ": "https://github.com/jamesqo/Emptify/releases/download/1.0/Emptify.x64.zip"
}
]
为什么会发生这种情况,我该怎样做才能绕过它呢?可能是Select
导致此问题的错误吗?
答案 0 :(得分:1)
这可能只是意外混合语法的一种情况。在最简单的形式中,您将使用Select-Object
来获取对象或对象集的指定属性。
因此,如果您希望$urls
成为具有browser_download_url
属性的对象数组,那么您只需要执行以下操作:
$urls = $latest.assets | Select-Object browser_download_url
您可以提取的基本属性是Get-Member
的结果,但是您应该在之前检查,在这种情况下使用了select。输出被截断为仅显示几个属性。
$latest.assets | gm
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
browser_download_url NoteProperty System.String browser_download_url=https://github.com/jamesqo/Emptify/releases/download/1.0/Em
created_at NoteProperty System.String created_at=2015-11-24T21:43:02Z
download_count NoteProperty System.Int32 download_count=0
url NoteProperty System.String url=https://api.github.com/repos/jamesqo/Emptify/releases/assets/1068007
有理由将代码与相似。自定义排序属性和计算属性。但这里都不需要这些。