2012-12-20 15 views
5

Voglio analizzare JSON in PowerShell ma non riesco a utilizzare le nuove funzioni v3 disponibili in PowerShell. Il mio primo pensiero è stato quello di caricare l'assembly JSON.Net e usarlo per analizzare la stringa JSON, ma non funziona come mi aspetto.Come utilizzare Json.NET per analizzare JSON in PowerShell?

ho questo JSON:

$json = "{""Name"": ""Apple"", 
      ""Price"": 3.99, 
      ""Sizes"": [  
       ""Small"",  
       ""Medium"", 
       ""Large""]}" 

ho caricare l'assembly JSON.NET con questo codice:

[Reflection.Assembly]::LoadFile("$currentPath\Newtonsoft.Json.dll”) 

e cerca di analizzare con

$result = [Newtonsoft.Json.JsonConvert]::DeserializeObject($json) 

Ora mi aspetto che $result["Name"] è Apple ma non ottengo nulla lì. Qualche idea?

Il codice '$ result.ContainsKey ("Nome") returns True but $ result.GetValue ("Nome") returns null`.

risposta

9

Ok, ecco come ho fatto in modo che funziona fino ad almeno v2 PowerShell su Windows 2008.

In primo luogo, caricare l'assembly Json.NET per la versione che si desidera utilizzare, ho preso la versione 3.5 di .NET:

[Reflection.Assembly]::LoadFile("Newtonsoft.Json.dll") 

ho avuto la JSON in un file da quando è stato utilizzato in una configurazione di distribuzione che ho scritto, quindi avevo bisogno di leggere il file e quindi analizzare il JSON

$json = (Get-Content $FileName | Out-String) # read file 
$config = [Newtonsoft.Json.Linq.JObject]::Parse($json) # parse string 

Ora per ottenere i valori dalla configurazione è necessario utilizzare il metodo Item che sembra definito da PowerShell su hashtables/dizionari. Quindi, per ottenere un elemento che è una semplice stringa si può scrivere:

Write-Host $config.Item("SomeStringKeyInJson").ToString() 

Se avete avuto una serie di cose che avrebbe bisogno di fare qualcosa di simile

$config.Item("SomeKeyToAnArray") | ForEach-Object { Write-Host $_.Item("SomeKeyInArrayItem").ToString() } 

Per accedere agli elementi nidificati si scrive

$config.Item("SomeItem").Item("NestedItem") 

Ecco come ho risolto l'analisi di JSON con Json.NET in PowerShell.

+0

È inoltre possibile ottenere valori nidificati mediante la sintassi dell'array. '$ Config [ "SomeItem"] [ "NestedItem"]. ToString()' –

5

forse questo è ciò che stai dopo:

http://poshcode.org/2930

function Convert-JsonToXml { 
PARAM([Parameter(ValueFromPipeline=$true)][string[]]$json) 
BEGIN { 
    $mStream = New-Object System.IO.MemoryStream 
} 
PROCESS { 
    $json | Write-Stream -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 Write-Stream { 
PARAM(
    [Parameter(Position=0)]$stream, 
    [Parameter(ValueFromPipeline=$true)]$string 
) 
PROCESS { 
    $bytes = $utf8.GetBytes($string) 
    $stream.Write($bytes, 0, $bytes.Length) 
} 
} 



$json = '{ 
    "Name": "Apple", 
    "Expiry": 1230422400000, 
    "Price": 3.99, 
    "Sizes": [ 
     "Small", 
     "Medium", 
     "Large" 
    ] 
}' 

Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization 
$utf8 = [System.Text.Encoding]::UTF8     
(convert-jsonToXml $json).innerXML 

uscita:

<root type="object"><Name type="string">Apple</Name><Expiry type="number">1230422 
400000</Expiry><Price type="number">3.99</Price><Sizes type="array"><item type="s 
tring">Small</item><item type="string">Medium</item><item type="string">Large</it 
em></Sizes></root> 

Se si desidera che il nodo del nome:

$j=(convert-jsonToXml $json) 
$j.SelectNodes("/root/Name") 

o

$j |Select-Xml -XPath "/root/Name" |select -ExpandProperty node 
+3

No, al complesso. –

+3

cosa è troppo complesso ?? ho modificato la mia risposta e fornito un esempio. BTW Non penso che $ json sia un json valido (controlla http: // jsonlint.it /) –

+0

Eri corretto sul fatto che JSON non fosse corretto, l'ho aggiornato e rimosso la parte di data che lo rendeva corretto. Tuttavia, mi piace la tua risposta, quindi hai ottenuto un voto, ma non risponde alla mia domanda per due motivi. 1. Ho chiesto come farlo con Json.NET. 2. Non volevo analizzare json in xml, volevo che fosse analizzato. Ho trovato una soluzione con Json.Net che sto provando è davvero semplice e la pubblicheremo come risposta al più presto. –