Украсьте json в powershell 3
Дано стандартное значение строки json:
$jsonString = '{ "baz": "quuz", "cow": [ "moo", "cud" ], "foo": "bar" }'
Как я могу сделать так, чтобы все было красиво с символами новой строки, желательно без регулярного выражения?
Простейший метод, который я нашел до сих пор:
$jsonString | ConvertFrom-Json | ConvertTo-Json
Однако это кажется глупым.
3 ответа
Работает для меня. Скобки гарантируют, что get-content выполняется перед передачей. Глубина по умолчанию для convertto-json равна 2, что часто слишком мало.
function pjson ($jsonfile) {
(get-content $jsonfile) | convertfrom-json | convertto-json -depth 100 |
set-content $jsonfile
}
Я положил это в свой профиль
function PrettyPrintJson {
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
$json
)
$json | ConvertFrom-Json | ConvertTo-Json -Depth 100
}
Это работает с каналами и может быть автоматически заполнено, поэтому набирать, по крайней мере, несколько меньше:
cat .\file.json | PrettyPrintJson
curl https://api.twitter.com/1.1/statuses/user_timeline.json | PrettyPrintJson
Если вы действительно не хотите идти по простейшему пути, а именно использовать встроенные функции PowerShell | ConvertFrom-Json | ConvertTo-Json
Вот еще один метод, использующий JSON.net
# http://james.newtonking.com/projects/json-net.aspx
Add-Type -Path "DRIVE:\path\to\Newtonsoft.Json.dll"
$jsonString = '{ "baz": "quuz", "cow": [ "moo", "cud" ], "foo": "bar" }'
[Newtonsoft.Json.Linq.JObject]::Parse($jsonString).ToString()
Добавляя к ответу @JS2010, я добавил логику, чтобы избежать определенных символов и еще больше очистить мой вывод. Скобка кажется ключевой и-depth
является большим, поскольку вы можете потерять детали без него, из того, что я видел, на глубине, которая превышает значение по умолчанию 5, я считаю, что это так.
function Format-Json ($JSON)
{
$PrettifiedJSON = ($JSON) | convertfrom-json | convertto-json -depth 100 | ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) }
$PrettifiedJSON
}
Я думаю, что вы ищете это:
$jsonString = @{
'baz' = 'quuz'
'cow'= "moo, cud"
'foo'= "bar"
}
$jsonString|ConvertTo-Json
он производит этот вывод
{
"baz": "quuz",
"cow": "moo, cud",
"foo": "bar"
}
Добавленное примечание Вы также можете упорядочить значения вашей коровы, чтобы "предварительно откорректировать" ее немного больше:
$jsonString = @{
'baz' = 'quuz'
'cow'= @("moo"; "cud")
'foo'= "bar"
}
выход:
{
"baz": "quuz",
"cow": [
"moo",
"cud"
],
"foo": "bar"
}