powershell ConvertTo-Json似乎挂起

u2nhd7ah  于 2023-04-21  发布在  Shell
关注(0)|答案(2)|浏览(107)

文件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吗?
对于如何让这个例子工作有什么建议吗?

4c8rllxm

4c8rllxm1#

tl;dr

  • 您的问题特定于 Windows PowerShell(它不再影响PowerShell (Core) 7+)。
  • 一个适用于 * 两个 * 版本的解决方案是将Get-Content -Raw …调用转换为[string]
@{ chart = [string] (Get-Content C:\temp\minimal.json -Raw) } | 
  ConvertTo-Json -Depth 100

注意:在这种情况下,-Depth 100 * 不是 * 必需的,因为默认深度2足以序列化您的输入哈希表(chart条目值的 * 内容 *,由于是 * 字符串 ,与递归深度无关-将下面讨论的不受欢迎的Windows PowerShell行为放在一边)。
然而,
一般来说 * 值得注意的是是否需要-Depth参数-参见this post

背景信息:
  • Get-Content在两个PowerShell版本中都使用ETS (Extended Type System)属性装饰其[string]输出对象。
  • 这些属性是:PSChildNamePSDrivePSParentPathPSPathPSProviderReadCount,您可以使用Get-Content C:\temp\minimal.json -Raw | Get-Member -Type NoteProperty发现它们)。
  • 在 * 仅Windows PowerShell * 中,当这些输出对象通过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属性。

wfveoks0

wfveoks02#

这似乎是一种变通方法:

$minimal = Get-Content c:\temp\minimal.json -raw

$literal = @"
$minimal
"@

$json = @{ 
    
    chart = $literal

} | ConvertTo-Json -Depth 100

相关问题