使用 Select-Object with ConvertFrom-Json returns 奇怪的结果
Using Select-Object with ConvertFrom-Json returns weird results
我正在编写需要 de/serialize 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 中成功提取我需要的值,但它们存储在 [=16] 的一些奇怪的 属性 名称下=],这似乎是我的 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
中的错误导致的?
这可能只是偶然混合语法的情况。在最简单的形式中,您将使用 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)
<b>browser_download_url</b> 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
有理由让代码与上面的代码相似。自定义排序属性和计算属性。不过这里不需要这些。
我正在编写需要 de/serialize 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 中成功提取我需要的值,但它们存储在 [=16] 的一些奇怪的 属性 名称下=],这似乎是我的 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
中的错误导致的?
这可能只是偶然混合语法的情况。在最简单的形式中,您将使用 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)
<b>browser_download_url</b> 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
有理由让代码与上面的代码相似。自定义排序属性和计算属性。不过这里不需要这些。