2013-04-18 2 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

Командлет 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

Yay спасибо, что это работает! – justinf

+0

@mjolinor, это ответ, но вы встретили случай, когда json, посланный сервером, настолько велик, что CdmLet отправляет вам исключение? Если да, то как вы решаете? – JPBlanc

+0

Это не соответствует этому случаю. Я не сталкивался с этим исключением, но если вы исходите из предположения, что вы всегда можете получить это исключение, то преобразование-fromjson бесполезно. – mjolinor

1

Большую часть времени я использую в настоящее время Командлет дается @mjolinor, но я до сих пор с помощью следующей старой моды XML сериализации в двух случаях:

1- Когда я должен использовать PowerShell V2

2- Даже в PowerShell V3, когда 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 
Смежные вопросы