【问题标题】:PowerShell: ConvertTo-Json problem containing special charactersPowerShell:包含特殊字符的 ConvertTo-Json 问题
【发布时间】:2015-06-01 02:54:07
【问题描述】:

我正在编写一个脚本来更改 JSON 文件,但是当文件转换回 JSON 时,它会扩展特殊字符。

例如,JSON 文件包含带有“&”的密码。复制问题的一种快速方法是使用以下命令:

PS> "密码&123" |转换为 JSON 输出为:“密码\u0026123”

##Here is how I import the JSON FILE:
$jsonfile = (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
##Exporting JSON FILE without modifying it.
$jsonfile  | ConvertTo-Json |Out-File "new.json"

--这里是一个简化的 JSON FILE 示例

{
    "Server1":
    {
        "username":"root",
        "password":"Password&dfdf"
    },
    "Server2":
    {
        "username":"admin",
        "password":"Password&1234"
    }
}

【问题讨论】:

    标签: json powershell


    【解决方案1】:

    这是由Convertto-Json 的自动字符转义功能引起的,它会影响<>\'& 等几个符号

    ConvertFrom-Json 将正确读取转义字符。使用您的示例:

    PS C:\> {"Password\u0026123"} | ConvertFrom-Json
    Password&123
    

    您的示例代码会生成一个包含转义字符的文件,但ConvertFrom-Json 可以将其读回原始密码。见下文:

    PS C:\> (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
    Server1                                  Server2
    -------                                  -------
    @{username=root; password=Password&dfdf} @{username=admin; password=Password&1234}
    
    PS C:\> (Get-Content .\new.json -Encoding Ascii) -join "`n" | ConvertFrom-Json
    Server1                                  Server2
    -------                                  -------
    @{username=root; password=Password&dfdf} @{username=admin; password=Password&1234}
    

    如果您需要不转义地存储密码,则可能需要进行一些更高级的工作。看到这个关于Converting Unicode strings to escaped ascii strings的帖子

    或者,尽可能避免受影响的字符。

    【讨论】:

    • 谢谢!我想我会在它的 convertfrom-json 之后做一些转换密码的工作......我会尽快更新......
    • 我只是重新阅读了您的帖子,并意识到这不再是一个真正的问题。现在证明是一个化妆品问题。即使密码是 unicode 格式,它也可以工作..所以我现在不用担心转换它..
    • 谢谢!这对我有帮助,但是将生成的 JSON 传递给 AWS CLI 我需要去除一些字符,同时仍然保持 JSON 语法。这对我(和 AWS CLI)有用: $jsonstring = $json | ConvertTo-Json -压缩; $jsonstring = $jsonstring.Replace("\n","") ; $jsonstring = $jsonstring.Replace("\r","") ; $jsonstring = $jsonstring.Replace(" ","") ;
    【解决方案2】:

    试试 Unescape() 方法:

    $jsonfile | ConvertTo-Json | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Out-File "new.json"
    

    【讨论】:

    • 警告:这会删除所有转义,包括 JSON 中可能需要的一些转义,例如转义引号字符:"expression": "My name is \"joe\""。这会给您留下损坏的 JSON...
    • 我发现以下答案最令人满意 - stackoverflow.com/a/47779605/2778027
    【解决方案3】:

    用 PowerShell 7.2 测试,出现 unicode 和其他特殊字符转换成功。更不用说缩进似乎也得到了改善。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2016-08-06
      相关资源
      最近更新 更多