2012-12-20 16 views
5

Chcę parsować JSON w PowerShell, ale nie mogę używać nowych funkcji v3, które są dostępne w PowerShell. Moją pierwszą myślą było załadowanie zestawu JSON.Net i użycie go do przeanalizowania łańcucha JSON, ale nie działa tak, jak tego oczekuję.Jak korzystać z Json.NET do parsowania json w PowerShell?

mam ten JSON:

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

załadować zespół Json.NET z tym kodem:

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

i stara się analizować je z

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

Teraz spodziewam to $result["Name"] to Apple, ale nic nie dostaję. Jakieś pomysły?

Kod "$ result.ContainsKey (" Name ") returns True but $ result.GetValue (" Name ") returns null`.

Odpowiedz

9

Ok, więc tutaj jest, jak to zrobiłem, więc to działa w dół do co najmniej PowerShell v2 na Windows 2008.

Najpierw załadować zespół Json.NET dla wersji, którą chcesz użyć, wziąłem .NET 3.5 wersję:

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

miałem JSON w pliku, ponieważ został użyty w konfiguracji wdrożenia pisałem, więc potrzebne do odczytu pliku, a następnie analizować JSON

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

Teraz, aby uzyskać wartości z konfiguracji, musisz użyć metody Item, która wydaje się zdefiniowana przez PowerShell na hashtables/słownikach. Tak, aby uzyskać element, który jest prosty ciąg byłoby napisać:

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

Jeśli miał szereg rzeczy, które trzeba zrobić coś jak

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

Aby uzyskać dostęp do zagnieżdżonych elementów piszesz

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

W ten sposób rozwiązałem parsowanie JSON z Json.NET w PowerShell.

+0

Można również uzyskać wartości zagnieżdżone przy użyciu składni tablicy. '$ config [" SomeItem "] [" NestedItem "]. ToString()' –

5

może to jest to, co jesteś po:

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 

wyjściowa:

<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> 

Jeśli chcesz węzeł nazwa:

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

lub

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

Nie, do złożonych. –

+3

co jest zbyt skomplikowane? zredagowałem swoją odpowiedź i podam przykład. BTW Nie sądzę, że $ json jest prawidłowym jsonem (sprawdź http: // jsonlint.pl /) –

+0

Miałeś rację co do tego, że json nie jest poprawny, zaktualizowałem go i usunąłem część z datą, która uczyniła ją poprawną. Jednak podoba mi się twoja odpowiedź, więc masz na to głos, ale nie odpowiada na moje pytanie z dwóch powodów. 1. Pytałem o to, jak to zrobić z Json.NET. 2. Nie chciałem parsować jsona do xml, chciałem go sparsować. Znalazłem rozwiązanie z Json.Net, które próbuję, jest bardzo proste i wkrótce opublikuję to jako odpowiedź. –

Powiązane problemy