文件minimal.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": {
"formatter": function(value, context) { var idx = context.dataIndex; return context.chart.data.labels[idx]; },
"display": true
}
}
},
"type": "scatter"
}
如果我在控制台上执行以下命令:
@{ chart = Get-Content C:\temp\minimal.json -Raw } | ConvertTo-Json -Depth 100
控制台似乎挂起。它对C-c
没有响应。
这是ConvertTo-Json
中的bug吗?
对于如何让这个例子工作有什么建议吗?
2条答案
按热度按时间4c8rllxm1#
tl;dr
Get-Content -Raw …
调用转换为[string]
:注意:在这种情况下,
-Depth 100
* 不是 * 必需的,因为默认深度2
足以序列化您的输入哈希表(chart
条目值的 * 内容 *,由于是 * 字符串 ,与递归深度无关-将下面讨论的不受欢迎的Windows PowerShell行为放在一边)。然而, 一般来说 * 值得注意的是是否需要
-Depth
参数-参见this post。背景信息:
Get-Content
在两个PowerShell版本中都使用ETS (Extended Type System)属性装饰其[string]
输出对象。PSChildName
、PSDrive
、PSParentPath
、PSPath
、PSProvider
和ReadCount
,您可以使用Get-Content C:\temp\minimal.json -Raw | Get-Member -Type NoteProperty
发现它们)。ConvertTo-Json
序列化时,这些属性被 * 包含 *。-Depth 100
序列化任意.NET对象可能会导致序列化的数据量过多,甚至可能导致 * 无限循环 *,具体取决于对象的性质-这就是您所看到的,因为序列化中包含ETS属性。Get-Content -Raw …
调用隐式地转换为[string]
会 * 丢弃 * ETS属性,从而产生一个 * 未修饰的 *[string]
示例,该示例仅序列化为它的 * 文本 *,从而绕过了这个问题。[1][PR #15665](https://github.com/PowerShell/PowerShell/pull/15665)在PowerShell(Core)7.2.中生效,现在特意排除了
[string]
和[datetime]
类型的ETS属性。wfveoks02#
这似乎是一种变通方法: