2010-04-29 11 views
1

Voici ma situation. J'ai un module PowerShell qui importe la bibliothèque PowerShell-JSON; cette bibliothèque convertit les chaînes JSON en objets PowerShell. Mon module fournit une interface à CouchDB, donc mes chaînes JSON sont obtenues à partir d'appels HTTP. J'ai une fonction, Send-CouchDbRequest, qui fait la requête HTTP à CouchDB et renvoie les données de réponse sous la forme d'une chaîne (les données de réponse sont obtenues en utilisant StreamReader.ReadToEnd()). Dans une autre fonction, Get-CouchDbDocument, j'appelle Send-CouchDbRequest et enregistre la sortie dans une variable, $json. Selon $json.GetType() et $json | Get-Member, il s'agit du type System.String. Si je puis nourrir cette chaîne dans ConvertFrom-JSON, je compte obtenir un PSCustomObject avec des propriétés définies en fonction du document JSON qui lui est fourni; à la place, j'obtiens une représentation sous forme de chaîne d'une table de hachage PowerShell, c'est-à-dire @{name1=value; name2=value2; name3=value3}. L'objet renvoyé est également de type System.String sur la base des mêmes tests que ci-dessus, plutôt que le PSCustomObject attendu. Il me semble que PowerShell fait une sorte de conversion de type automatique (et non désirée/inutile) ici.Est-ce un cas limite dans le mécanisme de résolution de type de PowerShell?

Le bug n'est pas dans PowerShell-JSON - J'ai déjà discussed it with the author, et nous avons tous deux réussi à obtenir le même appel à ConvertFrom-JSON pour travailler dans un module fictif. Je conclus donc que l'erreur doit être dans mon code quelque part, peut-être un résultat du fait que la chaîne est entrée par HTTP.

Le code pour Get-CouchDbDocument est comme suit:

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 
} 

Le code pour Send-CouchDbRequest est assez longue, et can be found on GitHub. La chaîne échantillon JSON, qui échoue dans le scénario que je viens de décrire et travaille ailleurs, est:

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

Toute pensée? Merci d'avance.

+0

Pourriez-vous publier le résultat de 'Send-CouchDbRequest' pour le tester? Ou est-ce celui-là dans le problème sur CodePlex? – stej

+0

C'est la chaîne JSON du problème CodePlex. Je vais mettre à jour la question. – alastairs

Répondre

3

Wow, celui-ci était assez difficile.

Ce qui vous aidera à changer le nom de variable qui stocke l'objet.

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

Raison: vous avez spécifié dans le bloc param, ce type de la variable $document doit être [string]. C'est pourquoi PowerShell va essayer de convertir la sortie de ConvertFrom-JSON en chaîne.

Une autre solution possible consiste à spécifier le paramètre $document sans le type.

+0

Visage -> Palm. Je revérifierai quand je rentrerai à la maison ce soir avant d'accepter la réponse, mais je suis sûr à 99% que ça va le réparer. Le rasoir d'Occam à la rescousse à nouveau! – alastairs

+0

Je n'ai pas vu le problème aussi, j'ai dû l'essayer. Quoi qu'il en soit, j'espère l'avoir trouvé;) – stej

+0

Trié; Merci beaucoup! Aide toujours à avoir une autre paire d'yeux :-) – alastairs