默认情况下,PowerShell 无法可靠地往返 JSON。如何确保此类 JSON 正确往返?
下面是中断的往返序列化的最小示例:
PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress
{"a":[{"b":""}]}
从{}
到""
的意外更改会导致 JSON 不再有效。
这是在版本 5.1 下:
PS> $PSVersionTable.PSVersion.ToString()
5.1.15063.674
同样,正如 https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/15123162-convertto-json-doesn-t-serialize-simple-objects-pr 所讨论的那样,'[{"b":{}]' | ConvertFrom-Json | ConvertTo-Json
也是值得怀疑的。但是,请考虑此问题未涵盖的可疑性质。
点PEBKAC,一点点为什么会这样?!
这似乎是-Depth
和修剪逻辑的问题。设置"更深"会导致往返行为按预期工作。将截断结尾作为字符串,而不是说null
,似乎很不幸 - 尽管如果发现"To String"是正确的终止,则可能是一致的。
更改为"(意外(:
PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 2
'{"a":[{"b":""}]}'
往返(预期(:
PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 3
'{"a":[{"b":{}}]}'