这种行为很神秘!
考虑以下PowerShell脚本:
[Reflection.Assembly]::LoadFrom("Newtonsoft.Json.dll") | Out-Null
function ConvertFrom-JsonNet {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string] $Json
)
$O = [Newtonsoft.Json.Linq.JObject]::Parse($Json)
Write-Host $O.GetType().Name
return $O
}
Clear-Host
$Json = '{"test":"prop"}'
$O1 = ConvertFrom-JsonNet '{"test":"prop"}'
$O2 = [Newtonsoft.Json.Linq.JObject]::Parse($Json)
Write-Host $O1.GetType().Name
Write-Host $O2.GetType().Name
您希望输出为:
JObject
JObject
JObject
但不是!它' S:
JObject
JProperty
JObject
这怎么可能?对象在中的类型如何在函数JObject
中,但是在它从函数中传出后,它是JProperty
?
答案 0 :(得分:0)
嗟
对于PowerShell缺乏灵活性!
显然,PowerShell将“展开”所有发往该管道的集合。在这种情况下,JObject
会实现ICollection<KeyValuePair<string, JToken>>
。 JObject
的集合包含一个JProperty
,它正在“展开”到管道中。我找到了this回答,其中显示将集合滚动到外部集合中会导致将预期值放入管道中。
如果PowerShell有一个向管道添加内容的机制,那不是很好吗? :)