PowerShell如何将字符串转换为JSON格式

6
在PowerShell中,我有以下从文件中读取的字符串,需要转换为json格式:
"@{Account='User01';Domain='Domain01';Admin='True'}"

我的 Power Shell 脚本尝试执行以下操作(简化版):

$myStr = "@{Account='User01';Domain='Domain01';Admin='True'}" | ConvertTo-Json
$mystr

myStr的结果是:

"@{Account=\u0027User01\u0027;Domain=\u0027Domain01\u0027;Admin=\u0027True\u0027}"

我得到的不是可以使用的JSON,注意字符串开头的@符号。

我该如何将它转换为可用的对象?

2个回答

10
你可以尝试一些字符串操作,将其转换为预期的JSON格式,然后使用ConvertFrom-Json将其转换为PSCustomObject
简单示例:(之所以简单是因为假设这些被替换的字符只是分隔符)
# First, clean up the string.
PS C:\> $mystring = "@{Account='User01';Domain='Domain01';Admin='True'}"
PS C:\> $mystring = $mystring -replace "^@", ""
PS C:\> $mystring = $mystring -replace "=", ":"
PS C:\> $mystring = $mystring -replace ";", ","
PS C:\> $mystring
{Account:'User01',Domain:'Domain01',Admin:'True'}

# Afterwards, convert to PSCustomObject.
PS C:\> $myobject = $mystring | ConvertFrom-Json
PS C:\> $myobject

Account                                 Domain                                  Admin
-------                                 ------                                  -----
User01                                  Domain01                                True

这也可以转换回JSON格式:
PS C:\> $myobject | ConvertTo-Json
{
    "Account":  "User01",
    "Domain":  "Domain01",
    "Admin":  "True"
}

2
以上适用于深度最多为2的Json或PS对象。如果您的对象包含嵌套对象,则需要指定-Depth参数。
    PS C:\> $json=
    '{
       "level1":[
          {
             "attr1":"value1",
             "level2":[
                {
                   "attr2.1":"value2.1",
                   "attr2.2":"value2.2"
                }
             ]
          }
       ],
       "Comment":"3-level object"
    }'
    
    PS C:\> $psobj = ConvertFrom-Json $json
    
    PS C:\> $psobj
    
    level1                                    Comment       
    ------                                    -------       
    {@{attr1=value1; level2=System.Object[]}} 3-level object
    
    
    
    PS C:\> Convertto-Json $psobj
    {
        "level1":  [
                       {
                           "attr1":  "value1",
                           "level2":  ""
                       }
                   ],
        "Comment":  "3-level object"
    }
    
    PS C:\> Convertto-Json $psobj -Depth 3
    {
        "level1":  [
                       {
                           "attr1":  "value1",
                           "level2":  [
                                          "@{attr2.1=value2.1; attr2.2=value2.2}"
                                      ]
                       }
                   ],
        "Comment":  "3-level object"
    }
    
    PS C:\> Convertto-Json $psobj -Depth 4
    {
        "level1":  [
                       {
                           "attr1":  "value1",
                           "level2":  [
                                          {
                                              "attr2.1":  "value2.1",
                                              "attr2.2":  "value2.2"
                                          }
                                      ]
                       }
                   ],
        "Comment":  "3-level object"
    }

你可能猜到了,Depth 的默认值是 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接