PowerShell cmdlet is changing the type of the returned object -
this behavior mystifying!
consider following powershell script:
[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 you'd expect output be:
jobject jobject jobject but it's not! it's:
jobject jproperty jobject how possible? how type of object within function jobject, after it's passed out of function, it's jproperty?
sigh
yay powershell's inflexibility!
apparently, powershell "unroll" collections destined pipeline. in case, jobject implements icollection<keyvaluepair<string, jtoken>>. jobject's collection contains single jproperty, being "unrolled" pipeline. found this answer, shows rolling collection outer collection cause intended value placed in pipeline.
wouldn't nice if powershell had mechanism adding pipeline untouched? :)
Comments
Post a Comment