使用PowerShell的ConvertFrom-Json解析JSON时数据截断及格式转换问题
搞定PowerShell解析JSON的截断问题,还能转成你要的竖线格式
嘿,先给你捋清楚:你看到的数据截断只是PowerShell控制台的显示限制而已,实际你已经拿到了完整的JSON数据!先解决这个显示问题,再给你写脚本转换成你要的格式。
第一步:解决数据截断问题
当你直接用Invoke-WebRequest $request | ConvertFrom-Json时,PowerShell为了不让输出太杂乱,会自动截断长内容,但转换后的JSON对象是完整的。你可以换个方式先把完整内容提取出来:
$request = 'http://localhost:8000/hi.json' # 先获取响应的完整文本内容,再转成JSON对象 $jsonData = (Invoke-WebRequest $request).Content | ConvertFrom-Json
现在你直接查看$jsonData.data,就能看到完整的结构了,不会再出现na...这种截断的情况。
第二步:转换成竖线分隔格式
接下来写脚本遍历JSON结构,生成你要的格式。这里需要处理每个站点的totalMessages和identifier数组,拼接成指定的字符串:
$request = 'http://localhost:8000/hi.json' $jsonData = (Invoke-WebRequest $request).Content | ConvertFrom-Json # 遍历data下的所有站点(swindon、Reading、Yanki) foreach ($site in $jsonData.data.PSObject.Properties) { $siteName = $site.Name $siteInfo = $site.Value # 输出totalMessages对应的行 "$siteName|totalMessages|$($siteInfo.totalMessages)" # 遍历identifier数组里的每一项 foreach ($item in $siteInfo.identifier) { # 按照你的示例调整名称:ET_2→ET2,UT_2→U_T $formattedName = switch ($item.name) { 'ET_2' { 'ET2' } 'UT_2' { 'U_T' } default { $item.name } } "$siteName|identifier|$formattedName|$($item.staleCount)" } }
运行这个脚本后,输出就完全符合你的要求了:
swindon|totalMessages|0 swindon|identifier|ET|4 swindon|identifier|ET2|4 Reading|totalMessages|0 Reading|identifier|J3|2 Yanki|totalMessages|0 Yanki|identifier|UT|4 Yanki|identifier|U_T|4
小说明
- 用
$jsonData.data.PSObject.Properties是因为data下面的站点名称是动态的(swindon、Reading这些),这样能自动遍历所有站点,不用硬写固定名称 - 名称转换的
switch块是根据你给的示例做的,如果后续有更多需要调整的名称,直接在switch里加新规则就行
内容的提问来源于stack exchange,提问作者mr i.o
相关产品推荐
相关产品推荐

