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