2

我有来自 json 查询的以下输出,我正在寻找一种方法来搜索它并提取 tvdbid 的值(数字 72663)并将其存储在一个变量中。

在下面的示例中,您可以看到实际上有 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"
}
4

2 回答 2

4

使用 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
于 2013-04-18T20:25:30.717 回答
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
于 2013-04-19T03:49:24.777 回答