使用PowerShell编辑JSON时的缩进与键序美化问题
解决PowerShell编辑appsettings.json的缩进与键顺序问题
问题根源
- 键顺序混乱:你使用的普通哈希表
@{}是无序结构,PowerShell会自动调整键的排列顺序,不会保留你手动插入的顺序。 - 缩进异常:默认
ConvertTo-Json的缩进行为在不同PowerShell版本中存在差异,且Out-File默认编码可能导致文件格式出现错乱。
修复方案
1. 用有序字典锁定键顺序
将所有普通哈希表替换为有序字典[ordered]@{},它会严格保留你添加键的先后顺序。
2. 显式指定缩进与编码
- 使用
ConvertTo-Json的-Indent参数指定缩进空格数(比如-Indent 2),统一JSON文件的缩进格式。 - 给
Out-File添加-Encoding utf8参数,避免编码问题引发的格式异常。
修改后的完整代码
$appSettings = Get-Content C:\test\appsettings.json | ConvertFrom-Json # 用有序字典保证键的插入顺序 $httpData = [ordered]@{"Url"="http://*:2201"} $httpsData = [ordered]@{} $httpsData.Add("Url","https://*:2203") $httpsData.Add("SslProtocols",$("Tls12", "Tls13")) $httpsData.Add("Certificate",[ordered]@{"Subject"="SubjectName";"Store"="My";"Location"="CurrentUser";"AllowInvalid"="True";}) $endPointsData = [ordered]@{} $endPointsData.Add("Http",$httpData) $endPointsData.Add("HttpsInlineCertStore",$httpsData) $KestrelData = [ordered]@{} $KestrelData.Add("EndPoints",$endPointsData) $appSettings | Add-Member -Name 'Kestrel' -Value $KestrelData -MemberType NoteProperty # 显式指定缩进和编码,确保格式正确 $appSettings | ConvertTo-Json -Depth 6 -Indent 2 | Out-File "C:\test\appsettings.json" -Encoding utf8
额外说明
- 如果你使用PowerShell 5.1或更早版本,
ConvertTo-Json没有-Indent参数,可以安装第三方模块(比如PSScriptTools的ConvertTo-JsonPretty)来处理格式化,或者直接升级到PowerShell 7+获得原生友好的JSON支持。 - 若需要将
Kestrel属性插入到JSON的特定位置,仅用Add-Member追加无法实现,需要重新构建整个对象结构来调整属性顺序。
内容的提问来源于stack exchange,提问作者HammerOfSweden
相关产品推荐
相关产品推荐

