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.
Pourriez-vous publier le résultat de 'Send-CouchDbRequest' pour le tester? Ou est-ce celui-là dans le problème sur CodePlex? – stej
C'est la chaîne JSON du problème CodePlex. Je vais mettre à jour la question. – alastairs