#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 }