2012-12-20 15 views
5

मैं पावरशेल में JSON को पार्स करना चाहता हूं लेकिन मैं PowerShell में उपलब्ध नए v3 फ़ंक्शंस का उपयोग नहीं कर सकता। मेरा पहला विचार JSON.Net असेंबली को लोड करना था और JSON स्ट्रिंग को पार्स करने के लिए इसका उपयोग करना था, लेकिन यह काम नहीं करता है क्योंकि मैं इसकी उम्मीद करता हूं।मैं PowerShell में जेसन को पार्स करने के लिए Json.NET का उपयोग कैसे करूं?

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

मैं इस कोड के साथ JSON.NET विधानसभा लोड:

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

और

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

अब मैं उम्मीद के साथ यह पार्स करने के लिए कोशिश करता है

मैं इस JSON है कि $result["Name"]Apple है लेकिन मुझे वहां कुछ भी नहीं मिला है। कोई विचार?

कोड '$ परिणाम .ContainsKey ("नाम") returns सही but $ परिणाम। गेटवेल्यू ("नाम") returns शून्य'।

उत्तर

9

ठीक है, तो यहाँ है कैसे मैंने किया तो यह विंडोज 2008

पर कम से कम PowerShell v2 के लिए नीचे काम करता है सबसे पहले, संस्करण आप उपयोग करना चाहते हैं के लिए Json.NET विधानसभा लोड करते हैं, मैं .NET 3.5 संस्करण ले लिया:

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

क्योंकि यह एक तैनाती विन्यास मैंने लिखा में इस्तेमाल किया गया था मैं एक फ़ाइल में JSON था, इसलिए मैं फ़ाइल को पढ़ने और json तो पार्स करने के लिए की जरूरत

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

अब कॉन्फ़िगरेशन से मूल्य प्राप्त करने के लिए आपको Item विधि का उपयोग करने की आवश्यकता है जो PowerShell द्वारा हैशटेबल्स/शब्दकोशों पर परिभाषित किया गया है। तो एक आइटम एक सरल स्ट्रिंग है कि प्राप्त करने के लिए आप लिखते हैं:

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

आप चीजों की एक सरणी आप नेस्टेड आइटम का उपयोग करने के

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

की तरह कुछ करने की ज़रूरत होता था, तो आप

बारे में
$config.Item("SomeItem").Item("NestedItem") 

इस प्रकार मैंने पावरशेल में जेसन.नेट के साथ JSON पार्सिंग हल किया।

+0

आप सरणी वाक्यविन्यास का उपयोग करके नेस्टेड मान भी प्राप्त कर सकते हैं। '$ Config [" SomeItem "] [" NestedItem "]। ToString()' –

5

शायद यह है कि तुम क्या कर रहे हैं के बाद:

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 

आउटपुट:

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

आप नाम नोड चाहते हैं:

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

या

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

नहीं, जटिल के लिए। –

+3

क्या जटिल है ?? मैंने अपना जवाब संपादित किया है और एक उदाहरण प्रदान किया है। बीटीडब्ल्यू मुझे नहीं लगता कि $ जेसन एक वैध जेसन है (http: // jsonlint देखें।com /) –

+0

आप जेसन के सही होने के बारे में सही थे, मैंने इसे अपडेट किया है और तारीख भाग को हटा दिया है जो इसे सही बनाता है। हालांकि, मुझे आपके उत्तर पसंद हैं इसलिए आपको इसके लिए वोट मिला, लेकिन यह दो कारणों से मेरे प्रश्न का उत्तर नहीं देता है। 1. मैंने Json.NET के साथ इसे कैसे किया है इसके बारे में पूछा है। 2. मैं जेसन को एक्सएमएल पर पार्स नहीं करना चाहता था, मैं चाहता था कि यह पार्स हो। मुझे जेसन के साथ समाधान मिला है। नेट कि मैं कोशिश कर रहा हूं कि यह वास्तव में सरल है और जल्द ही इसे उत्तर के रूप में पोस्ट करेगा। –