开发者

Is this an edge case in PowerShell's type resolution mechanism?

Here's my situation. I have a PowerShell module which imports the PowerShell-JSON library; this library converts JSON strings into PowerShell objects. My module provides an interface to CouchDB, so my JSON strings are obtained from HTTP calls. I have a function, Send-CouchDbRequest, which makes the HTTP request to CouchDB and returns the response data as a string (the response data is obtained using StreamReader.ReadToEnd()).

In another function, Get-CouchDbDocument, I make a call to Send-CouchDbRequest, and save the output in a variable, $json. According to $json.GetType() and $json | Get-Member, this is of type System.String. If I then feed this string into ConvertFrom-JSON, I expect to get back a PSCustomObject with properties defined according to the JSON document supplied to it; instead, I get a string representation of a PowerShell hashtable, i.e., @{name1=value; name2=value2; name3=value3}. The obje开发者_JAVA百科ct returned is also of type System.String based on the same tests as above, rather than the expected PSCustomObject. It seems to me that PowerShell is doing some kind of automatic (and unwanted/unneeded) type conversion here.

The bug isn't in PowerShell-JSON - I've already discussed it with the author, and we have both managed to get the same call to ConvertFrom-JSON to work in a dummy module. I therefore conclude that the error must be in my code somewhere, perhaps a result of the fact that the string has come in over HTTP.

The code for Get-CouchDbDocument is as follows:

function Get-CouchDbDocument {
    param(
        [string] $document = $(throw "Document ID is required."),
        [string] $database = $(throw "Database name is required."),
        [string] $server = "127.0.01",
        [int] $port = 5984
    )

    $json = Send-CouchDbRequest -dbHost $server -port $port -database $database -document $document -includeDoc
    $document = $json | ConvertFrom-JSON
    Write-Output $document
}

The code for Send-CouchDbRequest is quite lengthy, and can be found on GitHub. The sample JSON string, that fails in the scenario I have described and works elsewhere, is:

{"_id":"f42d2e0c5be0a7ab7bdc1cba23fc1d73","_rev":"1-59414e77c768bc202142ac82c2f129de","key":"value"}

Any thoughts? Many thanks in advance.


Wow, this one was quite tricky.

What will help you is to change the variable name that stores the object.

$doc = $json | ConvertFrom-JSON
Write-Output $doc

Reason: you specified in param block, that type of the $document variable should be [string]. That's why PowerShell will try to convert output from ConvertFrom-JSON to string.

Other possible solution is to specify the $document parameter without the type.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜