【问题标题】:Parse JSON into Hashtable将 JSON 解析为 Hashtable
【发布时间】:2015-03-01 14:26:48
【问题描述】:

如何在 PowerShell 中将以下 JSON 解析为哈希表?我想将汽车名称(“BMW”)作为键和颜色(“深灰色”)作为哈希表中的值。

{
  "Car": [
    {"BMW": "Dark Gray"},
    {"Audi": "Yellow"}
  ]
}

【问题讨论】:

    标签: json parsing powershell hashtable


    【解决方案1】:

    像这样:

    $json = @'
    {
      "Car": [
        {"BMW": "Dark Gray"},
        {"Audi": "Yellow"}
      ]
    }
    '@
    
    $ht = @{}
    
    ConvertFrom-Json $json | Select-Object -Expand 'Car' | ForEach-Object {
        $ht[$_.PSObject.Properties.Name] = $_.PSObject.Properties.Value
    }
    

    如果您坚持使用 PowerShell v2,但至少有 .Net Framework 3.5,您可以改为使用 this 之类的东西:

    $json = @'
    ...
    '@
    
    $ht = @{}
    
    [void][Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')
    $serializer = New-Object Web.Script.Serialization.JavaScriptSerializer
    $serializer.DeserializeObject($json).Values.GetEnumerator() |
        ForEach-Object { $_ } |
        ForEach-Object { $ht[($_.Keys -join '')] = ($_.Values -join '') }
    

    如果这也不可能,但您的键/值对总是在一个(单独的)行上,您可以使用正则表达式提取数据(尽管我不推荐这种方法):

    $json = @'
    ...
    '@
    
    $ht = @{}
    
    $json -split "`n" | Where-Object {
        $_ -match '\{"(.*?)": "(.*?)"\}'
    } | ForEach-Object {
        $ht[$matches[1]] = $matches[2]
    }
    

    否则您将不得不自己编写 JSON 解析器。

    【讨论】:

    • 不幸的是,我的 powershell 版本是 2.0(没有 CoverFrom-Json),这是这个作业的标准。 (我知道这没有意义)。 powershell 2.0 是否支持类似的功能?
    • @Taewan 不是。不过,有一些不同的方法。查看更新的答案。
    【解决方案2】:

    在 Powershell v6 中,它内置了 ConvertFrom-Json:

    $hashtable = '{ "key1":"value1", "key2":"value2" }' | ConvertFrom-Json -AsHashtable
    

    例如:

    PS> $hashtable["key1"]
    value1
    

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 2015-11-23
      • 2021-12-26
      • 2011-10-08
      • 2013-06-12
      • 2012-04-18
      • 2012-04-18
      • 2012-11-19
      相关资源
      最近更新 更多