Задача: Преобразовать хэш-таблицу в JSON
Начиная с версии powershell 5 существует командлет ConvertTo-JSON, который с легкостью делает из хэш-таблицы JSON, но вот в более ранних версиях powershell приходится это делать вручную!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function ConvertTo-JsonCustom { param( [Parameter(Mandatory=$true)] [Hashtable]$InputObject ) $json = "{" foreach ($key in $InputObject.Keys) { $value = $InputObject[$key] if ($value -is [Hashtable]) { $json += "`"$key`":$($(ConvertTo-JsonCustom $value))" } elseif ($value -is [Array]) { $json += "`"$key`":[" foreach ($item in $value) { if ($item -is [Hashtable]) { $json += "$(ConvertTo-JsonCustom $item)," } else { $json += "$item," } } $json = $json.TrimEnd(",") + "]" } else { $json += "`"$key`":`"$value`"" } $json += "," } $json = $json.TrimEnd(",") + "}" return $json } |
Эта функция, названная ConvertTo-JsonCustom
, принимает хэш-таблицу (Hashtable
) в качестве обязательного параметра и возвращает JSON-строку, которая представляет собой сериализованное представление этой хэш-таблицы.
В первой строке функция создает переменную $json
со значением {
для начала JSON-строки.
Далее, функция проходит по каждому ключу в хэш-таблице, используя цикл foreach
. Для каждого ключа функция получает значение $value
, связанное с этим ключом в хэш-таблице.
Затем функция проверяет тип значения. Если значение является хэш-таблицей, функция вызывает сама себя рекурсивно и добавляет результат вызова в текущую JSON-строку, используя ключ как имя объекта.
Если значение является массивом, функция проверяет каждый элемент массива и, если элемент является хэш-таблицей, вызывает сама себя рекурсивно и добавляет результат в текущую JSON-строку, в противном случае просто добавляет элемент в JSON-строку.
Наконец, если значение не является ни хэш-таблицей, ни массивом, функция добавляет ключ и значение в JSON-строку в кавычках.
В конце функция удаляет последнюю запятую из строки и заканчивает ее символом }
. Затем она возвращает полученную JSON-строку.