需要从Powershell JSON嵌套对象中删除值和计数

ohtdti5x  于 2022-12-23  发布在  Shell
关注(0)|答案(2)|浏览(119)

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

$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(没有value和Count):

"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
uxh89sit

uxh89sit1#

我只需要用您想要保留的属性重新构建JSON。
首先,您可以使用Get-ContentConvertFrom-Json获取JSON数据。然后,您可以迭代每个JSON对象,创建一个新的PSCustomObject,它保留ProductNumberProductNameSizes属性,其中Sizes就是Sizes.value的数组。然后,我们可以使用ConvertTo-Json转换为JSON结构。用-Depth 3保留前三个级别,用Out-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"
      }
    ]
  } 
]
gtlvzcf8

gtlvzcf82#

解决方法:Remove-TypeData -TypeName System.Array

相关问题