给定一个从json(foo.json)创建的自定义powershell对象(bar)
你将如何按键的字母顺序对对象进行排序?
foo.json
{
"bbb": {"zebras": "fast"},
"ccc": {},
"aaa": {"apples": "good"}
}
期望输出
foo.json
{
"aaa": {"apples": "good"},
"bbb": {"zebras": "fast"},
"ccc": {}
}
示例
$bar = get-content -raw foo.json | ConvertFrom-Json
$bar.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
我使用sort-object尝试了以下方法$bar = $bar | Sort
$bar = $bar | Sort-Object
Sort-Object -InputObject $bar
Sort-Object -InputObject $bar -Property Name
Sort-Object -InputObject $bar -Property @{Expression="Name"}
Sort-Object -InputObject $bar -Property @{Expression={$_.PSObject.Properties.Name}}
我还尝试过将PSObject转换为哈希表(哈希表似乎自动根据名称排序),然后将该哈希表转换回json,但它再次失去了顺序。
$buzz = @{}
$bar.psobject.properties |Foreach { $buzz[$_.Name] = $_.Value }
ConvertTo-Json $buzz -Depth 9
- 更新**
更改foo.json以包含值和键
3条答案
按热度按时间vuv7lop31#
正如Mathias R. Jessen所指出的,这里没有要排序的 * 集合 *,只有一个对象 *,其属性 * 需要排序,因此需要通过
Get-Member
进行 * 反射 * 以获取对象的属性:更精简的版本使用
-pv
(-PipelineVariable
)“缓存”ConvertFrom-Json
生成的未排序自定义对象:11dmarpk2#
这个怎么样:
可直接从管道发送
sbdsn5lh3#
以下是@mklement0和@EricWeintraub的答案的综合版本:
所以你可以这样使用它: