Powershell转换为Json的格式不正确
我正在使用win_shell将powershell输出转换为json格式,以便稍后对其进行过滤。问题是我的Json格式不好 这是密码Powershell转换为Json的格式不正确,json,powershell,ansible,Json,Powershell,Ansible,我正在使用win_shell将powershell输出转换为json格式,以便稍后对其进行过滤。问题是我的Json格式不好 这是密码 - win_shell: | Get-ChildItem -Path <some_path> | Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending | Select-Object -First 20
- win_shell: |
Get-ChildItem -Path <some_path> |
Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
Select-Object -First 20 | ConvertTo-Json
register: register_results
- debug:
var: register_results
当我尝试过滤例如“parent”或“Name”时,这些额外的空格会导致错误。看起来除了“ConvertToJson”之外还必须有其他参数才能获得更清晰的输出
还有其他方法吗?根据,计划在PowerShell 6中改进转换为JSON
的JSON格式。您可以在转换为Json
后自行覆盖格式设置,如帖子所示。文章中提到的一些代码可能会解决您的问题:
# Formats JSON in a nicer format than the built-in ConvertTo-Json does.
function Format-Json([Parameter(Mandatory, ValueFromPipeline)][String] $json) {
$indent = 0;
($json -Split '\n' |
% {
if ($_ -match '[\}\]]') {
# This line contains ] or }, decrement the indentation level
$indent--
}
$line = (' ' * $indent * 2) + $_.TrimStart().Replace(': ', ': ')
if ($_ -match '[\{\[]') {
# This line contains [ or {, increment the indentation level
$indent++
}
$line
}) -Join "`n"
}
$obj = @{}
$json = $obj | ConvertTo-Json | Format-Json
或者,您应该能够使用converttojsonnewtonsoft
,或者通过安装和导入模块直接使用它,而不是converttojson
Install-Module Newtonsoft.Json
Import-Module Newtonsoft.Json
$obj = @{}
$json = $obj | ConvertTo-JsonNewtonsoft
# or Newtonsoft.Json directly (same code)
$obj = @{}
$json = [Newtonsoft.Json.JsonConvert]::SerializeObject($obj, [Newtonsoft.Json.Formatting]::Indented)
将其输出到一个文件应该会使正确读回更容易,而不是试图为主机输出进行复制。这实际上取决于您稍后尝试使用哪种语言进行过滤
Get-ChildItem -Path <some_path> |
Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
Select-Object -First 20 | ConvertTo-Json | Out-File C:\Some\Where\Awesome\OutputJson.json
输出的不是糟糕的Json,而是打印精美的Json:转换为Json
- 打印精美的JSON使用多行输出和基于空格的缩进,以提高可读性
- 然而,漂亮打印的JSON仍然是有效的JSON,任何JSON解析器都应该识别它
- 您可以使用
开关选择退出此漂亮的打印,以获得更高效但可读性较差的表示:-Compress
- 您将得到一个单行输出字符串(即使对于多个输入),没有多余的空白
“
转义为\”
)
因此,为了处理此类嵌入式JSON,您必须:
- 解析包含JSON的
- 获取包含嵌入JSON的属性的值(
).stdout\u行
- 然后解析它
ConvertTo JSON
输出字符串分解为一个行数组(正如属性名stdout_lines
所建议的那样),那么在将数组元素作为JSON处理之前,您必须首先将其连接回单个字符串
如果您想避免这一步,请使用
ConvertTo Json-Compress
这篇文章似乎也与此相关。如果您只是寻找单行,没有额外的空白输出,请使用ConvertTo Json-Compress
。可能重复+1,指出它在v6及更高版本中得到了改进。我切换到Powershell Core,它非常完美!
Get-ChildItem -Path <some_path> |
Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
Select-Object -First 20 | ConvertTo-Json | Out-File C:\Some\Where\Awesome\OutputJson.json
Get-ChildItem -Path "C:\Scripts" |
Where-Object {$_.PSIsContainer} | Sort-Object LastWriteTime -Descending |
Select-Object -First 20 | Export-Clixml C:\Some\Where\Awesome\Exported.xml