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 数据而不需要 ParsedHtmlHeadersInvoke-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"