2010-04-29 3 views
1

여기 내 상황이 있습니다. 나는 PowerShell-JSON 라이브러리를 가져 오는 PowerShell 모듈을 가지고있다. 이 라이브러리는 JSON 문자열을 PowerShell 객체로 변환합니다. My 모듈은 CouchDB에 대한 인터페이스를 제공하므로 JSON 문자열은 HTTP 호출에서 가져옵니다. 함수 (Send-CouchDbRequest)는 CouchDB에 HTTP 요청을하고 응답 데이터를 문자열로 반환합니다 (응답 데이터는 StreamReader.ReadToEnd()을 사용하여 얻음).PowerShell의 형식 확인 메커니즘에서 이것이 가장 중요한 경우입니까?

다른 함수 Get-CouchDbDocument에서 Send-CouchDbRequest를 호출하고 출력을 변수 $json에 저장합니다. $json.GetType()$json | Get-Member에 따르면이 유형은 System.String입니다. 그런 다음이 문자열을 ConvertFrom-JSON에 입력하면 제공된 JSON 문서에 따라 정의 된 속성을 사용하여 PSCustomObject을 다시 얻습니다. 대신 PowerShell 해시 테이블의 문자열 표현 (예 : @{name1=value; name2=value2; name3=value3})을 얻습니다. 반환 된 개체는 PSCustomObject이 아닌 위에서 설명한 것과 동일한 테스트를 기반으로 한 System.String 유형입니다. PowerShell이 ​​일종의 자동 (및 원치 않는/불필요한) 유형 변환을 여기에서하고있는 것처럼 보입니다.

버그는 PowerShell-JSON에 없습니다. 저는 이미 discussed it with the author을 사용하고 있으며, 동일한 모듈을 사용하기 위해 ConvertFrom-JSON에 대한 호출을 모두 처리했습니다. 따라서 오류는 어딘가에서 내 코드에 있어야한다고 결론을 내릴 수 있습니다. 아마도 문자열이 HTTP를 통해 들어 왔기 때문일 수 있습니다. 보내기-CouchDbRequest에 대한

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 
} 

코드는 매우 긴, 그리고 can be found on GitHub 다음과 같이

가져 오기 - CouchDbDocument에 대한 코드입니다. 다른 곳에서 설명한 시나리오에서 실패한 샘플 JSON 문자열은 다음과 같습니다.

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

의견이 있으십니까? 미리 감사드립니다.

+0

테스트를 위해'Send-CouchDbRequest'의 결과를 게시 할 수 있습니까? 아니면 CodePlex에 관한 문제입니까? – stej

+0

이것이 CodePlex 문제의 JSON 문자열입니다. 나는 그 질문을 갱신 할 것이다. – alastairs

답변

3

와우, 이건 상당히 까다 롭습니다.

개체를 저장하는 변수 이름을 변경하는 데 도움이되는 것은 무엇입니까?

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

이유 : 당신이 param 블록에 지정된는 $document 변수의 유형이 [string]을해야합니다. 이것이 PowerShell이 ​​ConvertFrom-JSON의 출력을 string으로 변환하려고하는 이유입니다.

다른 가능한 솔루션은 유형없이 $document 매개 변수를 지정하는 것입니다.

+0

얼굴 -> 종려. 나는 오늘 밤 집에 돌아와서 대답을 받아 들일 때 그것을 다시 확인 하겠지만, 나는 그것을 고칠 것이라는 것을 99 % 확신하고있다. 오캄의 면도날 다시 구출! – alastairs

+0

나는 문제를 보지 못했다. 시도해야했다. 어쨌든, 찾았 으면 좋겠다;) – stej

+0

Sorted; 정말 고마워! 다른 한 쌍의 눈을 보면서 항상 도움이됩니다 :-) – alastairs