为什么我会得到意外的converttojson结果,为什么我会得到System.Collections.Hashtable之类的值,和/或为什么往返($Json | ConvertFrom Json | ConvertTo Json)失败
元问题
Stackoverflow有一个很好的机制来防止重复的问题,但据我所知,没有机制来防止重复的原因。以这个问题为例:几乎每周都会有一个新问题出现,原因相同,但通常很难将其定义为重复问题,因为问题本身只是略有不同。
尽管如此,如果这个问题/答案本身以重复(或离题)而告终,我也不会感到惊讶,但不幸的是,stackoverflow没有可能写一篇文章来阻止其他程序员继续编写由这个“已知”陷阱引起的问题
复制品
几个具有相同共同原因的类似问题示例:
- PowerShell ConvertTo Json未按预期转换数组
(昨天) - Powershell使用嵌入式哈希表转换为json
- powershell“ConvertTo Json”的Json格式输出混乱
- 嵌套数组和转换为Json
- Powershell转换为JSON缺少嵌套级别
- 如何使用Powershell将JSON对象保存到文件
- 无法将数组中的PSCustomObjects正确转换回JSON
- ConvertTo Json将数组展平到3个级别
- 立即将对象数组添加到PSObject
- 为什么ConvertToJSON会删除值
- 如何将此JSON往返于PSObject和Powershell中
不同的
那么,这个“自我回答”的问题与上述重复的问题有什么不同吗?
它在标题中有一个共同的原因,因此它可以更好地防止由于相同原因而重复提问
答复
converttojson有一个-Depth参数:
指定包含的对象的多少级别包含在
JSON表示。
默认值为2
范例
要使用JSON文件执行完整的往返,您需要增加ConvertTo-JSONcmdlet的-Depth:
$Json | ConvertFrom Json | ConvertTo Json-深度9
TL;博士
可能是因为ConvertTo Json使用(.Net)完整类型名称终止比默认-Depth(2)更深的分支,程序员假定存在错误或cmdlet限制,并且不阅读帮助或相关内容。
就我个人而言,我认为在截断分支的末尾带有简单省略号(三点:…)的字符串会有更清晰的含义(另请参见:Github问题:8381)
为什么?
这个问题通常也会在另一个讨论中结束:为什么深度有限?
有些对象具有循环引用,这意味着子对象可能引用父对象(或其祖父母之一),如果将其序列化为JSON,则会导致不定式循环
以以下哈希表为例,该哈希表具有引用对象本身的父属性:
[email protected]{Guid=New Guid}
$Test.Parent=$Test
如果执行:$Test | converttojson,默认情况下,它将在深度级别2处方便地停止:
{
“Guid”:“a274d017-5188-4d91-b960-023c06159dcc”,
“家长”:{
“Guid”:“a274d017-5188-4d91-b960-023c06159dcc”,
“家长”:{
“Guid”:“a274d017-5188-4d91-b960-023c06159dcc”,
“父项”:“System.Collections.Hashtable”
}
}
}
这就是为什么自动将-深度设置为较大值不是一个好主意