Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prettify json in powershell 3

Given a standard json string value:

$jsonString = '{ "baz": "quuz", "cow": [ "moo", "cud" ], "foo": "bar" }'

How can I get this to be all pretty with newlines, preferably without brute-force regex?

Simplest method I've found so far is:

$jsonString | ConvertFrom-Json | ConvertTo-Json 

However, that seems kinda silly.

like image 617
Eris Avatar asked Jul 16 '14 19:07

Eris


People also ask

Can PowerShell parse JSON?

PowerShell makes it easy to modify JSON by converting JSON to a PSCustomObject. The object can then be modified easily like any other object. The object can then be exported back out using ConvertTo-Json.

What does ConvertFrom-JSON do?

The ConvertFrom-Json cmdlet converts a JavaScript Object Notation (JSON) formatted string to a custom PSCustomObject object that has a property for each field in the JSON string. JSON is commonly used by web sites to provide a textual representation of objects.


4 Answers

Works for me. Parentheses make sure get-content is done before piping. Default depth of convertto-json is 2, which is often too low.

function pjson ($jsonfile) {   (get-content $jsonfile) | convertfrom-json | convertto-json -depth 100 |      set-content $jsonfile } 
like image 171
js2010 Avatar answered Sep 22 '22 14:09

js2010


If you really don't want to go down the simplest route, which is to use inbuilt PowerShell functions | ConvertFrom-Json | ConvertTo-Json, here is another method, using 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() 
like image 25
TechSpud Avatar answered Sep 20 '22 14:09

TechSpud


I put this in my profile

function PrettyPrintJson {
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $json
    )
    $json | ConvertFrom-Json | ConvertTo-Json -Depth 100
}

Which works with pipes, and can be auto-completed, so it's at least somewhat less typing:

cat .\file.json | PrettyPrintJson
curl https://api.twitter.com/1.1/statuses/user_timeline.json | PrettyPrintJson
like image 28
bobbaluba Avatar answered Sep 22 '22 14:09

bobbaluba


Adding to @JS2010's answer I added logic to escape out certain characters and clean up my output even further. The parenthesis seems key and -depth is a big one since you can lose details without it, from what I've seen, on depth that goes beyond the default of 5, I believe it is.

function Format-Json ($JSON)
{
    $PrettifiedJSON = ($JSON) | convertfrom-json | convertto-json -depth 100 | ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) }
    $PrettifiedJSON
}
like image 25
Jim Britt - MSFT Avatar answered Sep 20 '22 14:09

Jim Britt - MSFT