ConvertTo-Json执行挂起问题排查及解决方法咨询
问题分析与解决办法
原因说明
这不是ConvertTo-Json的bug,问题出在你处理的是非标准JSON:原始文件里的formatter是JavaScript函数定义,而标准JSON只允许字符串、数字、布尔值、数组、对象、null作为值类型。当你把包含该函数的JSON字符串放入哈希表,再通过ConvertTo-Json序列化时,函数代码中的递归引用逻辑(比如context.chart.data.labels[idx])会导致ConvertTo-Json陷入无限递归处理,最终出现挂起且无法响应终止信号的情况。
解决方案
方案1:直接拼接JSON字符串(推荐)
如果你只是想把原始JSON包装到chart键下的新JSON对象中,无需使用ConvertTo-Json,直接手动拼接字符串即可绕过序列化问题:
"{`"chart`": $(Get-Content C:\temp\minimal.json -Raw)}"
方案2:移除非标准JSON内容
如果必须使用ConvertTo-Json,先修改原始JSON文件,移除其中的JavaScript函数部分(因为标准JSON不支持函数),比如将plugins.datalabels下的formatter字段删除,修改后的JSON如下:
{"data": {"labels": ["GERMAN AMERICAN BANK","JOHNSON BANK","WASHINGTON TRUST BANK"],"datasets": [{"data": [{"y": 43.84,"x": 51},{"y": 47.02,"x": 12},{"y": 58.21,"x": 53}],"label": "data"}]},"options": {"title": {"text": "Banks","display": true},"scales": {},"plugins": {"datalabels": {"display": true}}},"type": "scatter"}
之后再执行你的原命令就不会出现挂起。
方案3:使用第三方JSON处理模块
使用Newtonsoft.Json模块(对非标准JSON兼容性更好)来处理:
- 先安装模块:
Install-Module -Name PowerShellGet -Force -AllowClobber Install-Module -Name Newtonsoft.Json -Force
- 执行处理命令:
$chartContent = Get-Content C:\temp\minimal.json -Raw $jsonObject = @{ chart = $chartContent } [Newtonsoft.Json.JsonConvert]::SerializeObject($jsonObject)
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

