PowerShell — распечатать вывод JSON с отсортированным массивом объектов?

#arrays #json #powershell #sorting #pscustomobject

Вопрос:

Как я могу распечатать вывод JSON с отсортированным массивом объектов? Мой объект $result должен оставаться таким, как есть, порядок «Хорошо» или «Плохо» не имеет значения, я пытаюсь отсортировать объекты в массивах, отсортированных по свойству «count», в порядке возрастания.

Мой код:

 $result = [PSCustomObject]@{  Good = @()   Bad = @() }  $food = [PSCustomObject]@{  name = "Banana"  count = 2 }  if ($food.count -gt 3) { $result.Good  = $food } else { $result.Bad  = $food }  $sortGood = $result.Good | Sort-Object count $sortBad = $result.Bad | Sort-Object count Write-Output ($result | ConvertTo-Json)  

Мой вывод JSON выглядит так:

 {  "Good": [  {  "name": "Apple"  "count": 10  },  {  "name": "Lime"  "count": 5  },  {  "name": "Peach"  "count": 7  }  ],  "Bad": [  {  "name": "Banana"  "count": 2  },  {  "name": "Kiwi"  "count": 1  },  {  "name": "Orange"  "count": 3  }  ]  }  

Как я могу распечатать JSON, который выглядит так? (фрукты отсортированы по свойству «количество» в порядке возрастания)

 {  "Good": [  {  "name": "Lime"  "count": 5  },  {  "name": "Peach"  "count": 7  },  {  "name": "Apple"  "count": 10  },  ],  "Bad": [  {  "name": "Kiwi"  "count": 1  },  {  "name": "Banana"  "count": 2  },  {  "name": "Orange"  "count": 3  }  ]  }  

[Problem fixed] Edited solution:

 $result.Good = $result.Good | Sort-Object count $result.Bad = $result.Bad | Sort-Object count Write-Output ($result | ConvertTo-Json)  

Ответ №1:

Sort-Object не «сортирует объект». Он возвращает отсортированную копию объекта. Так что это

 $sortGood = $result.Good | Sort-Object count  

в результате $sortGood все будет правильно отсортировано и $result.Good останется точно таким, как было.

 $json = @" {  "Good": [  {"name": "Apple", "count": 10},  {"name": "Lime", "count": 5},  {"name": "Peach", "count": 7}  ],  "Bad": [  {"name": "Kiwi", "count": 1},  {"name": "Orange", "count": 4}  ]  } "@  $data = ConvertFrom-Json $json  $food = @{  name = "Banana"  count = 2 }  if ($food.count -gt 3) {  $data.Good  = $food } else {  $data.Bad  = $food }  $data.Good = $data.Good | Sort-Object count $data.Bad = $data.Bad | Sort-Object count  $result = $data | ConvertTo-Json -Depth 10 $result  

дает

 {  "Good": [  {  "name": "Lime",  "count": 5  },  {  "name": "Peach",  "count": 7  },  {  "name": "Apple",  "count": 10  }  ],  "Bad": [  {  "name": "Kiwi",  "count": 1  },  {  "count": 2,  "name": "Banana"  },  {  "name": "Orange",  "count": 4  }  ] }  

Обратите внимание, что я всегда переназначаю значения $data.Good и $data.Bad :

  • Использование $data.Good = $food создает новый массив (!) с $food в конце, а затем присваивает его $data.Good . (Это сокращенное $data.Good = $data.Good $food название .)
  • Использование $data.Good = $data.Good | Sort-Object count создает новый массив (!) в другом порядке, а затем присваивает его $data.Good .

Комментарии:

1. Спасибо, проблема была исправлена (см. правку), почему вы использовали «-Глубина 10»?

2. @Adela, чтобы вы знали об этом -Depth параметре. По умолчанию PowerShell преобразует вложенные данные глубиной до 2 уровней только в JSON. Больше вложенности, чем это, и вам нужно явно указать, сколько уровней вы хотите. 10 кажется мне более разумной величиной.

3. @Adela Также, вместо того, чтобы включать решение в свой вопрос, отметьте ответ, который привел вас в правильном направлении, как принятый.

Ответ №2:

Привет, я думаю, вы забыли добавить свойство после сортировки объекта, т. е.

 $sortGood = $result.Good | Sort-Object -Property count  

Попробуйте и дайте мне знать !!!

Комментарии:

1. Добавлять -Property на самом деле не нужно. Sort-Object предположим, что вы имеете -Property в виду, когда просто даете имя. Sort-Object count все в порядке.

Ответ №3:

Я бы сделал это вот так:

 ConvertTo-Json @{  Good = $result.Good | sort Count  Bad = $result.Bad | sort Count }