2016-11-08 7 views
8

से मैं इस जैसे एक Hashtable के एक JSON प्रतिनिधित्व प्राप्त करना चाहते हैंPowerShell Hashtable JSON

{ 
    "Path": "C:\\temp", 
    "Filter": "*.js" 
} 

हालांकि, अगर आप परिवर्तित कि JSON स्ट्रिंग ConvertFrom-Json के साथ वापस आपको एक हैशटेबल नहीं मिलता है लेकिन एक PSCustomObject है।

तो एक उपरोक्त हैशमैप को विश्वसनीय रूप से क्रमबद्ध कैसे कर सकता है?

+0

की [PSCustomObject Hashtable करने के लिए] (http://stackoverflow.com/questions/3740128/pscustomobject-to-hashtable) संभावित डुप्लिकेट –

उत्तर

14
$json = @{Path="C:\temp"; Filter="*.js"} | ConvertTo-Json 

$hashtable = @{} 

(ConvertFrom-Json $json).psobject.properties | Foreach { $hashtable[$_.Name] = $_.Value } 

से PSCustomObject to Hashtable

+0

thats बहुत अच्छा है, धन्यवाद! – 4c74356b41

4

JavaScriptSerializer अनुकूलित (XP पर स्थापित किया जा सकता, Win7 में शामिल और नवीन) .NET3.5 के बाद से उपलब्ध है, यह कई बार कन्वर्ट-FromJSON की तुलना में तेजी है और यह ठीक से नेस्टेड वस्तुओं को पार्स करता है , सरणियों आदि

function Parse-JsonFile([string]$file) { 
    $text = [IO.File]::ReadAllText($file) 
    $parser = New-Object Web.Script.Serialization.JavaScriptSerializer 
    $parser.MaxJsonLength = $text.length 
    Write-Output -NoEnumerate $parser.DeserializeObject($text) 
} 
+0

PowerShell 5.1 में मैंने पाया कि '$ parser.DeserializeObject ($ पाठ)' एक .NET शब्दकोश को deserialized, एक Hashtable नहीं हालांकि, deserialize विधि, के रूप में DeserializeObject विधि के विपरीत, एक Hashtable को deserialize करता है: '$ पार्सर। Deserialize ($ पाठ, @ {}। GetType()) '। –

2

इस पोस्ट के लिए इस सवाल का जवाब एक अच्छी शुरुआत है, लेकिन थोड़ा अनुभवहीन है जब आप और अधिक जटिल json अभ्यावेदन हो रही शुरू करते हैं।

कोड नीचे नेस्टेड json सरणियों और json वस्तुओं पार्स होगा।

[CmdletBinding] 
function Get-FromJson 
{ 
    param(
     [Parameter(Mandatory=$true, Position=1)] 
     [string]$Path 
    ) 

    function Get-Value { 
     param($value) 

     $result = $null 
     if ($value -is [System.Management.Automation.PSCustomObject]) 
     { 
      Write-Verbose "Get-Value: value is PSCustomObject" 
      $result = @{} 
      $value.psobject.properties | ForEach-Object { 
       $result[$_.Name] = Get-Value -value $_.Value 
      } 
     } 
     elseif ($value -is [System.Object[]]) 
     { 
      $list = New-Object System.Collections.ArrayList 
      Write-Verbose "Get-Value: value is Array" 
      $value | ForEach-Object { 
       $list.Add((Get-Value -value $_)) | Out-Null 
      } 
      $result = $list 
     } 
     else 
     { 
      Write-Verbose "Get-Value: value is type: $($value.GetType())" 
      $result = $value 
     } 
     return $result 
    } 


    if (Test-Path $Path) 
    { 
     $json = Get-Content $Path -Raw 
    } 
    else 
    { 
     $json = '{}' 
    } 

    $hashtable = Get-Value -value (ConvertFrom-Json $json) 

    return $hashtable 
} 
+0

यह एकमात्र तरीका था जिसने मेरे लिए पूरी तरह से काम किया। – FEST

0

मेरा मानना ​​है कि Converting JSON to a hashtable में प्रस्तुत समाधान ConvertFrom-Json

की PowerShell 6.0 कार्यान्वयन मैं कई JSON स्रोतों के साथ की कोशिश की और मैं हमेशा सही hashtable मिला के करीब है।

$mappings = @{ 
    Letters = ( 
     "A", 
     "B") 
    Numbers  = (
     "1", 
     "2", 
     "3") 
    Yes = 1 
    False = "0" 
} 

# TO JSON 
$jsonMappings = $mappings | ConvertTo-JSON 
$jsonMappings 

# Back to hashtable 
# In PowerShell 6.0 would be: 
# | ConvertFrom-Json -AsHashtable 
$jsonMappings | ConvertFrom-Json -As hashtable