Вывести все содержимое вложенной хэш-таблицы JSON в PoweShell - PullRequest
0 голосов
/ 04 февраля 2019

Как вывести все содержимое вложенной хэш-таблицы 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 от JSON PSCustomObject to Hashtable Как вывести несколько хеш-таблиц в Powershell

1 Ответ

0 голосов
/ 08 февраля 2019

Пользователь atscripter отправляет владельцам пакета следующее сообщение 'ConvertTo-Expression' :

" Я наткнулся на вашу" flatten-object"статья, когда я пытался изменить поведение PowerShell по умолчанию. Я обратился за помощью к stackoverflow и technet, и вместо того, чтобы писать код с нуля, я задавался вопросом, насколько трудно будет настроить« flatten-object »для достижения желаемого эффекта? Кажется, что функция выполняет сложную часть итерации по объектам. Я просто недостаточно квалифицирован, чтобы заставить их выводить данные в нужном формате. Ваш вклад очень важен!"

Для этого не нужно переписывать командлет flatten-object или ConvertTo-Expression.
Вам просто нужно сначала пройтись по level, а затем вызовите ConvertTo-Expression командлет (или собственный ConvertTo-Json командлет) для каждого свойства:

In 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'}}

In 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"}}
...