Это крайний случай в механизме разрешения типов PowerShell? - PullRequest
1 голос
/ 29 апреля 2010

Вот моя ситуация. У меня есть модуль PowerShell, который импортирует библиотеку PowerShell-JSON ; эта библиотека преобразует строки JSON в объекты PowerShell. Мой модуль предоставляет интерфейс для CouchDB, поэтому мои строки JSON получаются из HTTP-вызовов. У меня есть функция Send-CouchDbRequest, которая делает HTTP-запрос к CouchDB и возвращает данные ответа в виде строки (данные ответа получаются с использованием StreamReader.ReadToEnd()).

В другой функции, Get-CouchDbDocument, я вызываю Send-CouchDbRequest и сохраняю вывод в переменной $json. Согласно $json.GetType() и $json | Get-Member, это относится к типу System.String. Если я затем передам эту строку в ConvertFrom-JSON, я ожидаю получить обратно PSCustomObject со свойствами, определенными в соответствии с предоставленным ей документом JSON; вместо этого я получаю строковое представление хеш-таблицы PowerShell, т.е. @{name1=value; name2=value2; name3=value3}. Возвращаемый объект также имеет тип System.String на основе тех же тестов, что и выше, а не ожидаемый PSCustomObject. Мне кажется, что PowerShell выполняет какое-то автоматическое (и нежелательное / ненужное) преобразование типов здесь.

Ошибка не в PowerShell-JSON - я уже обсуждал ее с автором , и нам обоим удалось получить один и тот же вызов ConvertFrom-JSON для работы в фиктивном модуле. Поэтому я пришел к выводу, что ошибка должна быть где-то в моем коде, возможно, из-за того, что строка пришла по HTTP.

Код для Get-CouchDbDocument выглядит следующим образом:

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
}

Код для Send-CouchDbRequest довольно длинный, и можно найти на GitHub . Пример строки JSON, которая не выполняется в описанном мной сценарии и работает в другом месте:

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

Есть мысли? Большое спасибо заранее.

1 Ответ

3 голосов
/ 29 апреля 2010

Ух ты, этот был довольно хитрым.

Поможет вам изменить имя переменной, в которой хранится объект.

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

Причина: вы указали в блоке param, что тип переменной $document должен быть [string]. Вот почему PowerShell попытается преобразовать вывод из ConvertFrom-JSON в строку.

Другое возможное решение - указать параметр $document без типа.

...