PowerShell 数组排序发布 JSON 反之亦然



我在将数组元素放入 JSON 时遇到问题。 这是我的脚本:

function UpdateJSON() 
{
param (    
[string] $ApplicationSettingUserValue,
[string] $ApplicationSettingPassValue
)
$JSON = Get-Content $File| Out-String | ConvertFrom-JSON
$arrayUsers = @{"username"=$ApplicationSettingUserValue; "password"=$ApplicationSettingPassValue}
$JSON.users  | Add-Member  -Type NoteProperty -Name 'test_user' -Value $arrayUsers
ConvertTo-Json $JSON | Set-Content "..Desktopjsonusers.json"
}

在输出中,我收到以下 JSON:

{
"users":  {
"test user":  {   
"password":  "TestUser1pass",
"username":  "username"
}
}
}

问题是,当我尝试将第三个变量添加到数组中时,顺序在输出中变为正确:用户名、密码和 .否则,密码和用户名将以错误的顺序添加。 我试图将元素放入数组中,反之亦然,没有任何变化。 有谁知道我错过了什么?

所需的输出为:

{
"users":  {
"test user":  {   
"username":  "username",
"password":  "TestUser1pass"
}
}
}

正如@JozefZ所评论的那样,这个问题的工作是使用有序字典:

$arrayUsers = [ordered]@{"username"=$ApplicationSettingUserValue; "password"=$ApplicationSettingPassValue}

背景

默认情况下,ConvertFrom-Json cmdlet 返回对象 ([PSCustomObject]( 而不是哈希表(除非使用-AsHashtable参数(:

$Json.users.'test user'.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

或者,如果要显示整个PowerShell结构:

ConvertTo-Expression $Json    # https://www.powershellgallery.com/packages/ConvertTo-Expression
[pscustomobject]@{'users' = [pscustomobject]@{'test user' = [pscustomobject]@{
'username' = 'username'
'password' = 'TestUser1pass'
}}}

请注意,PSCustomObject的属性也是有序的。

这意味着,您可以使用[ordered]类型来创建其他用户:

$arrayUsers = [Ordered]@{username = 'user2'; password = 'pwd2'}
$Json.users | Add-Member -Type NoteProperty -Name 'test user2' -Value $arrayUsers

但这将为您提供不同的用户对象:

$Json.Users | ConvertTo-Expression
[pscustomobject]@{
'test user' = [pscustomobject]@{
'username' = 'username'
'password' = 'TestUser1pass'
}
'test user2' = [ordered]@{
'username' = 'user2'
'password' = 'pwd2'
}
}

但实际上最好使用[pscustomobject]类型创建其他用户对象:

$arrayUsers = [PSCustomObject]@{username = 'user2'; password = 'pwd2'}
$JSON.users | Add-Member -Type NoteProperty -Name 'test user2' -Value $arrayUsers
$Json.Users | ConvertTo-Expression
[pscustomobject]@{
'test user' = [pscustomobject]@{
'username' = 'username'
'password' = 'TestUser1pass'
}
'test user2' = [pscustomobject]@{
'username' = 'user2'
'password' = 'pwd2'
}
}

对于最终结果(如果您使用ConvertTo-Json序列化整个对象(并不重要,但如果您想在序列化用户列表之前操纵用户列表(例如排序(,它可能会

最新更新