首页 > 解决方案 > 需要从 Powershell JSON 嵌套对象中删除值和计数

问题描述

在 powershell 中,我试图通过对产品进行分组,将 CSV 文件转换为带有 Size 对象嵌套数组的 JSON。在下面的代码中 $ProductLines 来自 CSV 文件作为 powershell 对象。

 $UniqueProducts = $ProductLines | Group-Object -Property 'ProductNumber' | ForEach-Object {    

    $SizeObj = ($_.Group | Select-Object -Property `
      @{name="SizeCode"; Expression = {$_.Sizes}}, @{name="UPC"; Expression = {$_.UPCNo}} `
    )
    #$SizeObj | ConvertTo-Json -depth 10 | Out-File "C:\POWERSHELL\Sizes.txt"

    $_.Group | Select-Object -Property ProductNumber, ProductName, `
         @{name="Sizes"; Expression = {$SizeObj}} -Unique
  }

$UniqueProducts | ConvertTo-Json -depth 10 | Out-File "C:\POWERSHELL\UniqueProducts.txt"

上面的代码生成具有以下结构的 JSON 文件,附加层值:计数:

[
    {
        "ProductNumber":  "EBAGS101-00008",
        "ProductName":  "EBAGS101",
        "Sizes":  {
                      "value":  [
                                    {
                                        "SizeCode":  "XS",
                                        "UPC":  "201112291509"
                                    },
                                    {
                                        "SizeCode":  "S",
                                        "UPC":  "201112291510"
                                    }
                                ],
                      "Count":  2
                  }
    },
    {
        "ProductNumber":  "EBAGS101-001",
        "ProductName":  "EBAGS101",
        "Sizes":  {
                      "value":  [
                                    {
                                        "SizeCode":  "XS",
                                        "UPC":  ""
                                    },
                                    {
                                        "SizeCode":  "S",
                                        "UPC":  "098617106215"
                                    }
                                ],
                      "Count":  2
                  }
    }
]

如何从结果中删除valueCount层。当我只输出 $SizeObj 时,它没有 value 和 Count,我不确定valueCount如何在 $UniquProducts 中结束。在我的最终结果中,我尝试以以下格式创建 SizeObj(没有值和计数):

  "Sizes":   [
        {
            "SizeCode":  "XS",
            "UPC":  "201112291509"
        },
        {
            "SizeCode":  "S",
            "UPC":  "201112291510"
        }
    ]

更新:这里使用@RoadRunner 提供的答案是带有 csv 源的修改后的解决方案;其中 $ProductLines 是从 csv 文件转换的 Powershell 对象:

$Products = New-Object -TypeName System.Collections.ArrayList
$ProductLines | Group-Object -Property 'ProductNumber' | ForEach-Object {
  $SizeRanges = New-Object -TypeName System.Collections.ArrayList
  foreach ($object in $_.Group) {
    $SizeVal = [PSCustomObject]@($object | Select-Object -Property `
        @{name="SizeCode"; Expression = {$_.Sizes}}, `
        @{name="UPC"; Expression = {$_.UPCNo}}`
      )
      $SizeRanges.AddRange($SizeVal)|Out-Null
  }
  $grp = $_.Group[0];
  $product =  [PSCustomObject]@{
      ProductNumber = $grp.ProductNumber
      ProductName = $grp.ProductName
      Sizes = $SizeRanges
  }
  $products.Add($product)|Out-Null
} | ConvertTo-Json -Depth 3 | Out-File -FilePath output.json

标签: powershell

解决方案


我只是用你想保留的属性重建 JSON。

Get-Content首先,您可以使用和获取 JSON 数据ConvertFrom-Json。然后,您可以迭代每个 JSON 对象,创建一个新对象,PSCustomObject该对象保留ProductNumber和属性,其中ProductName只是来自 的数组。然后我们可以用 转换为 JSON 结构,用保持前三个级别,然后用 .将结果导出到输出文件。SizesSizesSizes.valueConvertTo-Json-Depth 3Out-File

$json = Get-Content -Path .\data.json | ConvertFrom-Json

& {
    foreach ($object in $json)
    {
        [PSCustomObject]@{
            ProductNumber = $object.ProductNumber
            ProductName = $object.ProductName
            Sizes = $object.Sizes.value
        }
    }
} | ConvertTo-Json -Depth 3 | Out-File -FilePath output.json

您可能还可以将上述逻辑集成到您已经拥有的内容中,因此您不需要首先重建 JSON。不幸的是,我无法真正展示如何做到这一点,因为我只能看到您正在生成的 JSON,所以我只能推荐一种解决方案来根据您的要求重建 JSON。

输出.json

[
  {
    "ProductNumber": "EBAGS101-00008",
    "ProductName": "EBAGS101",
    "Sizes": [
      {
        "SizeCode": "XS",
        "UPC": "201112291509"
      },
      {
        "SizeCode": "S",
        "UPC": "201112291510"
      }
    ]
  },
  {
    "ProductNumber": "EBAGS101-001",
    "ProductName": "EBAGS101",
    "Sizes": [
      {
        "SizeCode": "XS",
        "UPC": ""
      },
      {
        "SizeCode": "S",
        "UPC": "098617106215"
      }
    ]
  } 
]

推荐阅读