我在Powershell变量中具有以下JSON:

{
  "Object1": {
    "name": "asdf1",
    "criteria": 2
  },
  "Object2": {
    "name": "asdf2",
    "criteria": 1
  }
}
我想获取标准值为1的JSON。因此,结果应如下所示:
{
  "Object2": {
    "name": "asdf2",
    "criteria": 1
  }
}
我尝试使用以下代码:
$json | Get-ObjectMembers | Select-Object | where { $_.value.criteria -eq 1 };
虽然这基本上朝着正确的方向发展,但这并不是我想要的,因为结果看起来像这样:
{
    "name": "asdf2",
    "criteria": 1
}
看到Object2信息丢失了,并且一个深度级别丢失了。
如上所示,我如何才能获得理想的结果?

最佳答案

本质上,您只希望保留单个输入对象中感兴趣的属性,或者换句话说,就是删除不感兴趣的属性。
这是PSv4 +解决方案:

$json = @'
{
  "Object1": {
    "name": "asdf1",
    "criteria": 2
  },
  "Object2": {
    "name": "asdf2",
    "criteria": 1
  }
}
'@

($json | ConvertFrom-Json).psobject.Properties.
  Where({ $_.Value.criteria -eq 1 }).
    ForEach({ [pscustomobject] @{ $_.Name = $_.Value } }) |
      ConvertTo-Json
以上 yield :
{
  "Object2": {
    "name": "asdf2",
    "criteria": 1
  }
}

08-19 05:19