【问题标题】:How to output the content of a nested JSON hash table to a PSO using PowerShell?如何使用 PowerShell 将嵌套 JSON 哈希表的内容输出到 PSO?
【发布时间】:2019-06-27 20:55:01
【问题描述】:

如何将嵌套 JSON 哈希表的全部内容在一行中输出到 PSO?

$json = @"
{
    "outer": "value1",
    "outerArray": [
        "value2",
        "value3"
    ],
    "outerHash": {
        "inner": "value4",
        "innerArray": [
            "value5",
            "value6"
        ],
        "innerHash": {
            "innermost1": "value7",
            "innermost2": "value8",
            "innermost3": "value9"
        }
    }
}
"@

当前行为:只显示一个“级别”

$json | ConvertFrom-Json
outer  outerArray       outerHash                                              
-----  ----------       ---------                                              
value1 {value2, value3} @{inner=value4; innerArray=System.Object[]; innerHash=}

期望行为:递归展开并显示所有哈希/数组内容

$json | ConvertFrom-Json
outer  outerArray       outerHash                                              
-----  ----------       ---------                                              
value1 {value2, value3} @{inner=value4; innerArray=@(value5, value6); innerHash=@{innermost1=value7; innermost2=value8; innermost3=value9}}

以下似乎刷题但没有达到预期的效果: PowerShell Hashtable from JSON PSCustomObject to Hashtable How to output multiple hash tables in Powershell

【问题讨论】:

  • 您可能需要添加注释,当您寻址 .outerhash 时,innerarray 确实显示为一个数组。 ///// 我找不到任何关于为什么在显示更高级别时它没有展开的任何信息。
  • PowerShell 默认输出格式不适合您。我会说您需要编写一个自定义格式化函数,该函数递归到散列中并将数据(子)结构破坏为字符串。
  • @Lee_Dailey @ AnsgarWiechers - 感谢您的参与!

标签: arrays json powershell hash expand


【解决方案1】:

用户atscripter向包的所有者'ConvertTo-Expression'发送以下消息:

"我在尝试修改 PowerShell 的默认行为时遇到了您的 "flatten-object" 文章。我在 stackoverflow 和 technet 上寻求帮助,而不是从头开始编写代码,我想知道它有多难是调整“扁平对象”以达到预期的效果吗?似乎该函数完成了迭代对象的困难部分,我只是不够熟练,无法让它们以所需的格式输出。您的输入非常重要感激不尽!

您不必为此重写 flatten-object cmdlet 或 ConvertTo-Expression cmdlet。
您只需要遍历 first 级别,然后在每个属性上调用 ConvertTo-Expression cmdlet(或本机 ConvertTo-Json cmdlet):

PowerShell 格式中:

$Properties = @{}
($Json | ConvertFrom-Json).PSObject.Properties |
    ForEach-Object {$Properties.($_.Name) = $_.Value |
        ConvertTo-Expression -Expand -1}
[PSCustomObject]$Properties

结果:

outer    outerArray        outerHash
-----    ----------        ---------
'value1' 'value2','value3' [PSCustomObject]@{'inner'='value4';'innerArray'='value5','value6';'innerHash'=[PSCustomObject]@{'innermost1'='value7';'innermost2'='value8';'innermost3'='value9'}}

Json 格式中:

($Json | ConvertFrom-Json).PSObject.Properties |
    ForEach-Object {$Properties.($_.Name) = $_.Value |
        ConvertTo-Json -Depth 5 -Compress}

结果略有不同(Json)格式:

outer    outerArray          outerHash
-----    ----------          ---------
"value1" ["value2","value3"] {"inner":"value4","innerArray":["value5","value6"],"innerHash":{"innermost1":"value7","innermost2":"value8","innermost3":"value9"}}

【讨论】:

  • 干净、简单,完全符合我的需要。感谢 Ron 抽出宝贵时间来做这件事!
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
相关资源
最近更新 更多