2013-04-18 3 views
0

json 쿼리에서 다음과 같은 결과를 얻었습니다. 검색하는 방법을 찾고 tvdbid (숫자 72663) 및 저장소 값을 가져옵니다 변수에서.json 쿼리 결과의 일부를 powershell에 변수로 저장합니다.

아래 예에서 배열에 두 가지를 모두 저장하고 싶다면 실제로 2 개의 결과가 있음을 알 수 있습니다.

내 컴퓨터에서 powershell 3을 실행 중이므로 어떤 v3 특정 항목도 괜찮습니다.

아웃은 PS의 V3를 사용

{ 
    "data": { 
     "langid": 7, 
     "results": [ 
      { 
       "first_aired": "2010-11-15", 
       "name": "Accused", 
       "tvdbid": 72663 
      }, 
      { 
       "first_aired": "2010-01-17", 
       "name": "Enzai: Falsely Accused", 
       "tvdbid": 135881 
      } 
     ] 
    }, 
    "message": "", 
    "result": "success" 
} 
+0

이 cmdlet V3가 답이다,하지만 난 XML 직렬화와 답을 추가,이 json으로받은 난 아직도 경우에 사용하는 솔루션입니다 두 가지입니다. – JPBlanc

답변

1

을 넣어 :

$json = @' 
{ 
    "data": { 
     "langid": 7, 
     "results": [ 
      { 
       "first_aired": "2010-11-15", 
       "name": "Accused", 
       "tvdbid": 72663 
      }, 
      { 
       "first_aired": "2010-01-17", 
       "name": "Enzai: Falsely Accused", 
       "tvdbid": 135881 
      } 
     ] 
    }, 
    "message": "", 
    "result": "success" 
} 
'@ 

$psobj = ConvertFrom-Json $json 
$psobj.data.results.tvdbid 

72663 
135881 
+0

네, 고마워요! – justinf

+0

@mjolinor,이 답변이지만, 서버에서 보낸 json이 너무 커서 CdUmet이 예외를 다시 보낸 경우를 만났습니까? 그렇다면 어떻게 해결할 수 있습니까? – JPBlanc

+0

그런 경우는 맞지 않습니다. 그 예외는 발생하지 않았지만, 여러분이 항상 예외를 얻을 수 있다고 가정한다면, conver-fromjson은 쓸모가 없습니다. – mjolinor

1

지금 @mjolinor에 의해 주어진 cmdlet을 사용하는 대부분의 시간,하지만, 난 여전히 다음과 같은 구식 XML 직렬화를 사용 두 가지 경우 :

1- PowerShell V2를 사용해야 할 때

2 - 웹 서비스에서 반환 한 json이 매우 큰 PowerShell V3에서도 매우 PowerShell V3에서 예외를 보냅니다. 이것은 다음과 같은 줄 것이다 귀하의 경우에는

Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization 
$utf8 = [System.Text.Encoding]::UTF8  

function Write-String 

{ 
    PARAM([Parameter()]$stream, 
     [Parameter(ValueFromPipeline=$true)]$string) 

    PROCESS 
    { 
    $bytes = $utf8.GetBytes($string) 
    $stream.Write($bytes, 0, $bytes.Length) 
    } 
} 

function Convert-JsonToXml 

{ 
    PARAM([Parameter(ValueFromPipeline=$true)][string[]]$json) 

    BEGIN 
    { 
    $mStream = New-Object System.IO.MemoryStream 
    } 

    PROCESS 
    { 
    $json | Write-String -stream $mStream 
    } 

    END 
    { 
    $mStream.Position = 0 
    try 
    { 
     $jsonReader = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonReader($mStream,[System.Xml.XmlDictionaryReaderQuotas]::Max) 
     $xml = New-Object Xml.XmlDocument 
     $xml.Load($jsonReader) 
     $xml 
    } 
    finally 
    { 
     $jsonReader.Close() 
     $mStream.Dispose() 
    } 
    } 
} 

function Convert-XmlToJson 
{ 
    PARAM([Parameter(ValueFromPipeline=$true)][Xml]$xml) 

    PROCESS 
    { 
    $mStream = New-Object System.IO.MemoryStream 
    $jsonWriter = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonWriter($mStream) 
    try 
    { 
     $xml.Save($jsonWriter) 
     $bytes = $mStream.ToArray() 
     [System.Text.Encoding]::UTF8.GetString($bytes,0,$bytes.Length) 
    } 
    finally 
    { 
     $jsonWriter.Close() 
     $mStream.Dispose() 
    } 
    } 
} 

:

$json = @' 
{ 
    "data": { 
    "langid": 7, 
    "results": [{ 
     "first_aired": "2010-11-15", 
     "name": "Accused", 
     "tvdbid": 72663 
     }, 
     { 
     "first_aired": "2010-01-17", 
     "name": "Enzai: Falsely Accused", 
     "tvdbid": 135881 
     }] 
    }, 
    "message": "", 
    "result": "success" 
} 
'@ 

$xmlOut = Convert-JsonToXml -json $json 
($xmlOut.root.data.results).ChildNodes[0].tvdbid.InnerText 
($xmlOut.root.data.results).ChildNodes[1].tvdbid.InnerText