2013-04-18 47 views
0

我從json查詢中獲得以下輸出,並且正在尋找一種方法來搜索它,然後爲tvdbid(數字72663)和商店它在一個變量中。將json查詢結果的一部分存儲在powershell中的變量中

在下面的例子中,你可以看到實際上有2個結果,所以我希望它將兩者都存儲在數組中。

我在我的電腦上運行powershell 3,所以任何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

使用PS V3:

$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太大以至於CdmLet會發送異常嗎?如果是的話,你如何解決? – JPBlanc

+0

它不符合這種情況。我沒有遇到過這種例外情況,但是如果你假設你總是可以得到那個例外,那麼conver-fromjson就沒用了。 – mjolinor

1

大部分我現在@mjolinor給出的cmdlet的使用時間,但我還是用下面的老式XML序列化在兩種情況下:

1-當我必須使用PowerShell V2

2-甚至在PowerShell V3中,當由web服務返回的json的非常大時 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 
相關問題