当前位置: 首页 > 面试题库 >

意外的ConvertTo-Json结果?答案:它的默认深度为2

赵华彩
2023-03-14
问题内容

为什么会得到意外的ConvertTo- Json结果,为什么会得到类似的值System.Collections.Hashtable和/或为什么往返($Json | ConvertFrom-Json | ConvertTo-Json)失败?

元问题

Stackoverflow有一个很好的机制来防止重复的 问题, 但是据我所知,还没有一种机制可以防止有重复 原因的问题
。以这个问题为例:几乎每个星期都有一个新问题以相同的原因出现,但是通常很难将其定义为重复问题,因为问题本身只是稍有不同。不过,如果这个问题/答案本身最终以重复(或题外话)结尾,我不会感到惊讶,但是不幸的是stackoverflow无法撰写文章以防止其他程序员继续编写由“已知”陷阱引起的问题。

不同

那么,这个“自我回答”的问题是否与上述重复的问题有所不同?
它具有标题中的常见原因,因此可以更好地防止由于相同原因而重复问题。


问题答案:

回答

ConvertTo-Json有一个 -Depth 参数:

指定JSON表示形式中包含多少级包含的对象。
默认 值是 2

做一个完整的往返不同,需要增加一个JSON文件-DepthConvertTo-Jsoncmdlet的:

$Json | ConvertFrom-Json | ConvertTo-Json -Depth 9

TL; DR

可能是因为使用(.Net)完整类型名ConvertTo-Json终止了比默认值-Depth2
)更深的分支,因此程序员假定存在bug或cmdlet限制,并且不阅读帮助或大约。
我个人认为,在切除分支的末尾带有简单省略号(三个点:…)的字符串将具有更清晰的含义(另请参见:Github问题:8381)

为什么?

这个问题通常也以另一个讨论结尾: 为什么深度根本没有限制?

有些对象具有循环引用,这意味着子对象可以引用父项(或其子项之一),如果将其序列化为JSON则会导致无限循环。

以下面的哈希表为例,该哈希表具有parent指向对象本身的属性:

$Test = @{Guid = New-Guid}
$Test.Parent = $Test

如果执行:$Test | ConvertTo-Json默认情况下,它将方便地停在2级深度:

{
    "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设置为大量不是一个好主意的原因。



 类似资料:
  • 在我看来,我的缓冲区包含关于最后一个数据包步骤(路由器->my home)的信息,这些信息解释了为什么TTL值是254以及为什么我用Traceroute找到了相同的两个IP: $>traceroute qwant.com traceroute to qwant.com(194.187.168.99),30跳最大,60字节数据包 172.17.0.1(172.17.0.1)0.026 ms 0.01

  • 我有以下代码: 我的意图是所有对mocked的调用都应该以标准方式应答。但是对(这是公共的)的调用应该以特定的方式应答。 我发现,当我添加对< code>mobileMethod调用的应答时,不是附加< code>MobileServiceAnswer,Java实际上是调用< code > my service . mobile method ,这导致了NPE。 这可能吗?似乎应该可以覆盖默认答案

  • 我使用了以下映射:我修改了英语分析器来使用ngram分析器,如下所示,这样我应该能够在以下情况下进行搜索:1]部分搜索和特殊字符搜索2]以获得语言分析器的优势 将我的数据索引如下:

  • 问题内容: 当调用Surveymonkey api时 ,服务器需要使用它 作为json数据来完成我的请求。虽然它返回的数据是必需的,但它没有返回我认为我要求的其他URL。有谁知道为什么这不会给我这个? 编辑 https://developer.surveymonkey.com/mashery/get_collector_list, 这是我尝试拨打的电话,如果有帮助 问题答案: 正如评论中指出的那样

  • 我正在尝试加密laravel默认加密中的json编码字符串。但我不确定它使用的是AES-256-CBC。这背后的原因是,我还在尝试从AES自定义类进行相同的加密。 我所做的。 > json_编码数组 在AES自定义类中设置密钥、模式和块大小并生成令牌。 加密令牌。 使用setData设置加密令牌 使用AES自定义类解密 结果与我在步骤1中的结果相同。当我尝试加密(Crypt::encrypt($R

  • 问题内容: 给定一个变量,该变量包含巴黎时区的日期时间2000-01-01 00:01(冬季afaik中为UTC + 2): 我希望转换为UTC会导致日期时间为1999-12-31 22:01,但是却得到了: 我想念什么? 谢谢 问题答案: 不幸的是 ,在许多时区使用标准构造函数的参数“不起作用” 。 但是对于没有夏令时转换的时区来说是安全的,例如UTC: 您会注意到: “ LMT + 0:09: