Задача: Преобразовать хэш-таблицу в JSON
Начиная с версии powershell 5 существует командлет ConvertTo-JSON, который с легкостью делает из хэш-таблицы JSON, но вот в более ранних версиях powershell приходится это делать вручную!
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-строку.