我正在编写一个脚本来更改JSON文件,但是当文件转换回JSON时,它会扩展特殊字符。
例如,JSON文件包含带有"&"的密码。复制问题的快速方法是使用以下命令:
PS> "密码和安培; 123" |的ConvertTo JSON的 输出是:"密码\#34;
##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文件的例子
{
"Server1":
{
"username":"root",
"password":"Password&dfdf"
},
"Server2":
{
"username":"admin",
"password":"Password&1234"
}
}
答案 0 :(得分:21)
尝试使用Unescape()方法:
$jsonfile | ConvertTo-Json | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Out-File "new.json"
答案 1 :(得分:4)
这是由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
或者,如果可能,请避免受影响的字符。