PowerShell导出数组到JSON文件时如何保留属性定义的原有顺序
问题原因
属性乱序问题根源在于:你创建对象时使用的普通哈希表@{}是无序数据结构,不保留属性的定义插入顺序,因此转换为JSON时会输出随机排序的键。
解决方法
方案1:使用有序哈希表(兼容PowerShell 3.0及以上版本,推荐)
只需要给定义属性的哈希表加上[ordered]类型标记,即可保留属性的定义顺序,修改后的代码如下:
# 把原来的 @{ 替换为 [ordered]@{} 即可 New-Object PSObject -Property [ordered]@{ Name = $ADInfo.DisplayName Username = $Username Email = $Email Date = $Date Manager = $ManagerName ManagerEmail = $ManagerEmail Manager2 = $ManagerName2 ManagerEmail2 = $ManagerEmail2 Manager3 = $ManagerName3 ManagerEmail3 = $ManagerEmail3 ServiceTag = $ServiceTagTextBox.text FedExSentTracking = "https://www.fedex.com/fedextrack/?tracknumbers=" + $FedEXSentTextBox.text FedExRecievedTracking = "https://www.fedex.com/fedextrack/?tracknumbers=" + $FedEXRecievedTextBox.text } $script:jsonDB += $CollectionData $script:jsonDB | ConvertTo-Json -Compress | Set-Content C:\Support\HardwareCollection.json
方案2:使用PSCustomObject类型加速器(写法更简洁,同样兼容PowerShell 3.0+)
你也可以直接用[PSCustomObject]创建对象,无需调用New-Object,天然保留属性顺序:
$CollectionData = [PSCustomObject]@{ Name = $ADInfo.DisplayName Username = $Username Email = $Email Date = $Date Manager = $ManagerName ManagerEmail = $ManagerEmail Manager2 = $ManagerName2 ManagerEmail2 = $ManagerEmail2 Manager3 = $ManagerName3 ManagerEmail3 = $ManagerEmail3 ServiceTag = $ServiceTagTextBox.text FedExSentTracking = "https://www.fedex.com/fedextrack/?tracknumbers=" + $FedEXSentTextBox.text FedExRecievedTracking = "https://www.fedex.com/fedextrack/?tracknumbers=" + $FedEXRecievedTextBox.text }
方案3:兼容PowerShell 2.0的旧版本方案
如果你的运行环境只能使用PowerShell 2.0,没有有序哈希表支持,可以通过Select-Object手动指定属性顺序再转换JSON:
# 原创建对象的代码不变,导出前按定义顺序选择属性即可 $script:jsonDB | Select-Object Name,Username,Email,Date,Manager,ManagerEmail,Manager2,ManagerEmail2,Manager3,ManagerEmail3,ServiceTag,FedExSentTracking,FedExRecievedTracking | ConvertTo-Json -Compress | Set-Content C:\Support\HardwareCollection.json
内容的提问来源于stack exchange,提问作者Listor
相关产品推荐
相关产品推荐

