如何在powershell中解析json响应

问题描述 投票:1回答:3

设法获得JSON数据

$R= Invoke-WebRequest -Uri $url -Headers $headers -ContentType "application/json"   -Method Get -UseBasicParsing
$x = $R.Content | Out-String | ConvertFrom-Json 

现在我有一个像这样的JSON文件:

{
  "id": 1000,
  "name_with_namespace": "myProjectName1",

},
{
  "id": 1001,
  "name_with_namespace": "myProjectName2",

},
{
  "id": 1002,
  "name_with_namespace": "myProjectName3",

}

现在我需要提取所有qazxsw poi和qazxsw poi的发生地点qazxsw poi

我该如何一次性完成?

我试过这个:

"name_with_namespace"

但我得到了这个:

"id"

我知道问题出在$ x.id上,我怎样才能获得正确的价值而不是一切?

我的预期输出是

"name_with_namespace" = "myProjectName.*"
powershell iteration invoke-command
3个回答
6
投票

在定义循环时,您正在向下钻取一个级别。只需迭代foreach ($name in $x.name_with_namespace) { if ( $name -match ".*myProjectName.*" ) { write-host "$name - $x.id" } } 然后检查循环内的特定属性。

myProjectName1 1000 1001 1002
myProjectName2 1000 1001 1002
myProjectName3 1000 1001 1002

编辑:在侧面说明,你可以简化你的myProjectName1 1000 myProjectName2 1001 myProjectName3 1002 只是$x,它也会工作,也可能更快。


1
投票

所以基本上你已经获得了带有父节点的json,所以我没有覆盖那部分。假设您已经拥有父节点,那么您可以直接执行此操作:

foreach ($name in $x) {
    if ( $name.name_with_namespace -match ".*myProjectName.*" ) {    
        write-host "$($name.name_with_namespace) - $($name.id)"               
    }   
}

输出:

-match

您可以随意解析。那部分没有问题。确保您的json是从restAPI接收的结构。使用点方法,您可以进入任何级别,您也可以使用"myProjectName"直接选择它们。

希望能帮助到你。


0
投票

$a=@" {"ParentNode":[ {"id":1000,"name_with_namespace":"myProjectName"}, {"id":1001,"name_with_namespace":"myProjectName2"}, {"id":1002,"name_with_namespace":"myProjectName3"} ]} "@ ($a | ConvertFrom-Json).ParentNode 有一些id name_with_namespace -- ------------------- 1000 myProjectName 1001 myProjectName2 1002 myProjectName3 。问题是select-object将JSON数组包装在一个数组中,然后将整个数组作为一个项目传递给管道。在大多数情况下这很好,但如果最外层是JSON数组,则整个数组作为单个对象传递到管道中。

相比:

ConvertFrom-Json

请注意,最后一个示例我们可以使用一元逗号运算符复制问题。

有关PowerShell Core 6的问题已被报道为odd behavior with pipelines

试试这段代码:

ConvertFrom-Json
© www.soinside.com 2019 - 2024. All rights reserved.