如何在powershell中将嵌套JSON转换为哈希表?

vwkv1x7d  于 2023-02-08  发布在  Shell
关注(0)|答案(2)|浏览(157)

我尝试在Powershell的5.1版本中将JSON转换为哈希表。但是输出再次作为FieldMapping键的对象。我们可以获得FieldMapping键的键值对吗?
我们在7.1版本中有ConvertFrom-Json-AsHashtable。理想情况下,在5.1版本中也会尝试获得相同的o/p。下一步我可以尝试什么?

    • 我的儿子:**
$json = '[
 
                              {
 
                                  "EntityType": "IP",
 
                                  "FieldMapping":  [
 
                                                       {
 
                                                           "ColumnName":  "FileHashCustomEntity"
                                                            "Identifier":  "Address"
                                                           
 
                                                       }
 
                                                   ]
 
                              }
 
                          ]'
    • 我的密码:**
$entities = $json | ConvertFrom-Json 
$ht2 = @{}
$hash = $entities.psobject.properties | Foreach { $ht2[$_.Name] = $_.Value }
echo $ht2
    • 我的输出:**
Key   : EntityType
Value : IP
Name  : EntityType

Key   : FieldMapping
Value : {@{ColumnName=FileHashCustomEntity; Identifier=Address}}
Name  : FieldMapping
    • 预期产出:**
Key   : EntityType
 Value : IP
 Name  : EntityType

 Key   : FieldMapping
 Value : {FileHashCustomEntity}
 Name  : FieldMapping
b5buobof

b5buobof1#

这是可行的。包括调试语句,以便您可以看到数据是如何组织的

$json = @" 
[
 
                              {
 
                                  "EntityType": "IP",
 
                                  "FieldMapping":  [
 
                                                       {
 
                                                           "ColumnName":  "FileHashCustomEntity",
                                                            "Identifier":  "Address"
                                                           
 
                                                       }
 
                                                   ]
 
                              }
 
                          ]
"@
$entities = $json | ConvertFrom-Json 
$entities
$ht2 = [System.Collections.ArrayList]::new()
$newRow = New-Object -TypeName psobject
$newRow | Add-Member -NotePropertyName EntityType -NotePropertyValue $entities.EntityType
foreach($property in $entities.FieldMapping)
{
$property | Format-Table
   $newRow | Add-Member -NotePropertyName ColumnName -NotePropertyValue $property.ColumnName  
   $newRow | Add-Member -NotePropertyName Identifier -NotePropertyValue $property.Identifier
 
}
$ht2.Add($newRow)  | Out-Null

$ht2 | Format-Table
e1xvtsh3

e1xvtsh32#

现在,您将得到一个包含自定义对象作为条目的顶级哈希表-您需要做的是 * 递归地 * 转换结果对象层次结构中的 * 每个对象 *。
下面是一个简单的函数:

function Convert-PSCToHashTable
{
  param(
    $InputObject, 
    [int]$Depth = 5
  )

  if($Depth -gt 0){
    if($InputObject -is [System.Collections.IList]){
      return @($InputObject |ForEach-Object {Convert-PSCToHashTable $_ -Depth ($Depth - 1)})
    }

    if($InputObject.psobject.BaseObject -is [System.Management.Automation.PSCustomObject]){
      $ht = @{}
      foreach($prop in $InputObject.psobject.Properties){
        $ht[$prop.Name] = Convert-PSCToHashTable $prop.Value -Depth ($Depth - 1)
      }
      return $ht
    }
  }

  return $InputObject
}

现在您可以执行以下操作:

$object = ConvertFrom-Json $json
$hashtable = Convert-PSCToHashTable $object

$hashtable['FieldMapping']['ColumnName'] # "FileHashCustomEntity"

相关问题