【问题标题】:Need to remove Value and Count from Powershell JSON nested object需要从 Powershell JSON 嵌套对象中删除值和计数
【发布时间】:2020-04-03 03:30:29
【问题描述】:

在 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 文件,附加层 value:Count:

[
    {
        "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


    【解决方案1】:

    我将使用您想要保留的属性重建 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。

    output.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"
          }
        ]
      } 
    ]
    

    【讨论】:

    • 非常感谢。您提供的逻辑帮助我解决了问题。由于我的源代码是使用上述逻辑的平面 csv 文件,因此不得不稍微调整一下代码。我将使用调整后的代码更新我的问题。
    • @RichardMneyan 不用担心。很高兴您发现该解决方案对您的场景很有帮助且适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多