Необходимо удалить значение и число из вложенного объекта Powershell JSON - PullRequest
1 голос
/ 03 апреля 2020

В PowerShell я пытаюсь преобразовать файл CSV в JSON с помощью вложенного массива объекта Size путем группировки продуктов. В приведенном ниже коде $ 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
                  }
    }
]

Как я могу удалить слой value и Count из моего результата. Когда я вывожу только $ SizeObj, у него нет значения и количества, я не уверен, как значение и Количество заканчиваются в $ UniquProducts. В своем конечном результате я пытаюсь создать SizeObj в следующем формате (без значения и количества):

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

ОБНОВЛЕНИЕ: с использованием ответа, предоставленного @RoadRunner, вот измененное решение с источником CSV; где $ ProductLines - это преобразованный объект Powershell из CSV-файла:

$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

1 Ответ

1 голос
/ 03 апреля 2020

Я бы просто перестроил JSON со свойствами, которые вы хотите сохранить.

Сначала вы можете получить данные JSON с Get-Content и ConvertFrom-Json. Затем вы можете выполнить итерацию каждого JSON объекта, создав новый PSCustomObject, в котором сохранятся свойства ProductNumber, ProductName и Sizes, где Sizes - это просто массив из Sizes.value. Затем мы можем преобразовать в JSON структуру с ConvertTo-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

Возможно, вы также можете интегрировать вышеуказанные логи c в то, что у вас уже есть, так что вам не нужно перестраивать 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"
      }
    ]
  } 
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...