Powershell ConvertFrom-Json 编码特殊字符问题
Powershell ConvertFrom-Json Encoding Special Characters Issue
我的 powershell 脚本中有这段代码,但它在特殊字符部分的表现不佳。
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request |
ConvertFrom-Json |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"
在我的输出文件中我只得到'????'对于任何特殊字符。有谁知道如何让它在我的输出文件中显示特殊字符?
尝试将 .Content
属性 的值转换为 JSON:
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request
($a.Content | convertfrom-json).Data.Players | select DisplayName,FactionTag | Out-file "$scriptPath\getFactionTag.txt" -Encoding Default
如果您只需要 json 数据而不需要 ParsedHtml
、Headers
和 Invoke-WebRequest
返回的其他对象,请使用 Invoke-RestMethod
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-RestMethod -ContentType "application/json; charset=utf-8" $request |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"
Peter Schneider's helpful answer and Nas' helpful answer 都解决了 一个 你的方法的问题:你需要:
或者:在 Invoke-WebRequest
返回的响应 object 上访问 .Content
属性 以获得实际的 数据 返回(作为 JSON 字符串),然后您可以将其传递给 ConvertFrom-Json
.
或:改用Invoke-RestMethod
,returns数据直接和将其解析为自定义objects,因此您可以直接使用这些 objects,而不需要 ConvertTo-Json
;但是,对于 character-encoding 问题,例如在这种情况下,这 不是 一个选项,因为需要 JSON 字符串的显式 re-encoding - 请参阅下面。
但是,你仍然有一个character-encoding问题,因为缺少charset
response header 中的信息,PowerShell 将 UTF-8 编码的 JSON 字符串解释为 ISO-8859-1 -encoded(从 PowerShell 7.0 开始仍然适用)。
有两种可能的解决方案:
最好修改 Web 服务以在响应 header 的 ContenType
字段中包含 charset=utf-8
。
如果您不能这样做,您必须显式re-encode接收到的字符串以更正character-encoding错误解释。
这是后者的实现:
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request
# $a.Content now contains the *misinterpreted* JSON string, so we must
# obtain its byte representation and re-interpret the bytes as UTF-8.
# Encoding 28591 represents the ISO-8859-1 encoding - see https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers
$jsonCorrected = [Text.Encoding]::UTF8.GetString(
[Text.Encoding]::GetEncoding(28591).GetBytes($a.Content)
)
# Now process the reinterpreted string.
$jsonCorrected |
ConvertFrom-Json |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"
我的 powershell 脚本中有这段代码,但它在特殊字符部分的表现不佳。
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request |
ConvertFrom-Json |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"
在我的输出文件中我只得到'????'对于任何特殊字符。有谁知道如何让它在我的输出文件中显示特殊字符?
尝试将 .Content
属性 的值转换为 JSON:
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request
($a.Content | convertfrom-json).Data.Players | select DisplayName,FactionTag | Out-file "$scriptPath\getFactionTag.txt" -Encoding Default
如果您只需要 json 数据而不需要 ParsedHtml
、Headers
和 Invoke-WebRequest
Invoke-RestMethod
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-RestMethod -ContentType "application/json; charset=utf-8" $request |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"
Peter Schneider's helpful answer and Nas' helpful answer 都解决了 一个 你的方法的问题:你需要:
或者:在
Invoke-WebRequest
返回的响应 object 上访问.Content
属性 以获得实际的 数据 返回(作为 JSON 字符串),然后您可以将其传递给ConvertFrom-Json
.或:改用
Invoke-RestMethod
,returns数据直接和将其解析为自定义objects,因此您可以直接使用这些 objects,而不需要ConvertTo-Json
;但是,对于 character-encoding 问题,例如在这种情况下,这 不是 一个选项,因为需要 JSON 字符串的显式 re-encoding - 请参阅下面。
但是,你仍然有一个character-encoding问题,因为缺少charset
response header 中的信息,PowerShell 将 UTF-8 编码的 JSON 字符串解释为 ISO-8859-1 -encoded(从 PowerShell 7.0 开始仍然适用)。
有两种可能的解决方案:
最好修改 Web 服务以在响应 header 的
ContenType
字段中包含charset=utf-8
。如果您不能这样做,您必须显式re-encode接收到的字符串以更正character-encoding错误解释。
这是后者的实现:
$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request
# $a.Content now contains the *misinterpreted* JSON string, so we must
# obtain its byte representation and re-interpret the bytes as UTF-8.
# Encoding 28591 represents the ISO-8859-1 encoding - see https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers
$jsonCorrected = [Text.Encoding]::UTF8.GetString(
[Text.Encoding]::GetEncoding(28591).GetBytes($a.Content)
)
# Now process the reinterpreted string.
$jsonCorrected |
ConvertFrom-Json |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"