为什么会得到意外的ConvertTo- Json结果,为什么会得到类似的值System.Collections.Hashtable和/或为什么往返($Json | ConvertFrom-Json | ConvertTo-Json)失败?
ConvertTo- Json
System.Collections.Hashtable
$Json | ConvertFrom-Json | ConvertTo-Json
Stackoverflow有一个很好的机制来防止重复的 问题, 但是据我所知,还没有一种机制可以防止有重复 原因的问题 。以这个问题为例:几乎每个星期都有一个新问题以相同的原因出现,但是通常很难将其定义为重复问题,因为问题本身只是稍有不同。不过,如果这个问题/答案本身最终以重复(或题外话)结尾,我不会感到惊讶,但是不幸的是stackoverflow无法撰写文章以防止其他程序员继续编写由“已知”陷阱引起的问题。
那么,这个“自我回答”的问题是否与上述重复的问题有所不同? 它具有标题中的常见原因,因此可以更好地防止由于相同原因而重复问题。
ConvertTo-Json有一个 -Depth 参数:
ConvertTo-Json
-Depth
指定JSON表示形式中包含多少级包含的对象。 该 默认 值是 2 。
做一个完整的往返不同,需要增加一个JSON文件-Depth的ConvertTo-Jsoncmdlet的:
$Json | ConvertFrom-Json | ConvertTo-Json -Depth 9
可能是因为使用(.Net)完整类型名ConvertTo-Json终止了比默认值-Depth( 2 )更深的分支,因此程序员假定存在bug或cmdlet限制,并且不阅读帮助或大约。 我个人认为,在切除分支的末尾带有简单省略号(三个点:…)的字符串将具有更清晰的含义(另请参见:Github问题:8381)
这个问题通常也以另一个讨论结尾: 为什么深度根本没有限制?
有些对象具有循环引用,这意味着子对象可以引用父项(或其子项之一),如果将其序列化为JSON则会导致无限循环。
以下面的哈希表为例,该哈希表具有parent指向对象本身的属性:
parent
$Test = @{Guid = New-Guid} $Test.Parent = $Test
如果执行:$Test | ConvertTo-Json默认情况下,它将方便地停在2级深度:
$Test | ConvertTo-Json
{ "Guid": "a274d017-5188-4d91-b960-023c06159dcc", "Parent": { "Guid": "a274d017-5188-4d91-b960-023c06159dcc", "Parent": { "Guid": "a274d017-5188-4d91-b960-023c06159dcc", "Parent": "System.Collections.Hashtable" } } }
这就是为什么自动将其-Depth设置为大量不是一个好主意的原因。