如何在PowerShell v2中向控制台格式化输出JSON响应?
嘿,在PowerShell v2里格式化输出JSON响应确实有点棘手——毕竟ConvertFrom-Json和ConvertTo-Json这些方便的cmdlet是从PowerShell v3才开始有的。不过咱们可以借助.NET类库来实现需求,下面给你两种实用的方案:
方案1:用原生.NET类输出结构化对象
这个方案会把JSON响应转成PowerShell对象,利用PowerShell自带的对象格式化能力输出,看数据结构很清晰:
"start" # 加载处理JSON需要的.NET程序集 Add-Type -AssemblyName System.Web.Extensions # 用WebClient简化请求,直接获取JSON内容 $webClient = New-Object System.Net.WebClient $jsonContent = $webClient.DownloadString("http://ipinfo.io/json") # 把JSON字符串反序列化为PowerShell对象 $serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer $jsonObject = $serializer.DeserializeObject($jsonContent) # 直接输出对象,PowerShell会自动格式化展示 $jsonObject "done"
运行后你会看到控制台以层级结构展示JSON里的键值对,可读性拉满。
方案2:输出标准缩进格式的JSON字符串
如果你需要输出标准的格式化JSON文本(而不是PowerShell对象),可以用Newtonsoft.Json这个老牌JSON处理库,步骤如下:
第一步:准备Newtonsoft.Json库
由于PowerShell v2基于.NET Framework 2.0,你需要获取适配.NET 2.0版本的Newtonsoft.Json.dll文件,将其放到当前脚本所在目录后,执行以下命令加载:
# 加载本地的Newtonsoft.Json.dll Add-Type -Path ".\Newtonsoft.Json.dll"
第二步:格式化输出JSON
"start" # 获取原始JSON内容 $webClient = New-Object System.Net.WebClient $jsonContent = $webClient.DownloadString("http://ipinfo.io/json") # 把JSON解析后再以缩进格式序列化 $prettyJson = [Newtonsoft.Json.JsonConvert]::SerializeObject( [Newtonsoft.Json.JsonConvert]::DeserializeObject($jsonContent), [Newtonsoft.Json.Formatting]::Indented ) # 输出格式化后的JSON Write-Host $prettyJson "done"
这样就能得到带换行和缩进的标准JSON文本,完全满足“Pretty Print”的需求。
基于你原始代码的修改版
如果你想沿用自己一开始写的WebRequest代码,只需要加上读取响应流和处理JSON的逻辑就行:
"start" Add-Type -AssemblyName System.Web.Extensions $request = [System.Net.WebRequest]::Create("http://ipinfo.io/json") $request.Method = "GET" [System.Net.WebResponse]$response = $request.GetResponse() # 读取响应流里的JSON内容 $streamReader = New-Object System.IO.StreamReader($response.GetResponseStream()) $jsonContent = $streamReader.ReadToEnd() # 记得关闭流和响应对象 $streamReader.Close() $response.Close() # 反序列化为对象并输出 $serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer $jsonObject = $serializer.DeserializeObject($jsonContent) $jsonObject "done"
内容的提问来源于stack exchange,提问作者Thufir
相关产品推荐
相关产品推荐

