Prettify json in powershell 3

后端 未结 5 1294
清酒与你
清酒与你 2020-12-03 04:43

Given a standard json string value:

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

How can I get

相关标签:
5条回答
  • 2020-12-03 05:03

    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
    
    0 讨论(0)
  • 2020-12-03 05:08

    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
    }
    
    0 讨论(0)
  • 2020-12-03 05:10

    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()
    
    0 讨论(0)
  • 2020-12-03 05:12

    I think what you are looking for is this:

    $jsonString = @{ 
    'baz' = 'quuz'
    'cow'= "moo, cud"
    'foo'= "bar" 
    }
    $jsonString|ConvertTo-Json
    

    it produces this output

    {
        "baz":  "quuz",
        "cow":  "moo, cud",
        "foo":  "bar"
    }
    

    Added note You could also array your cow values to "prettify" it a bit more:

     $jsonString = @{ 
        'baz' = 'quuz'
        'cow'= @("moo"; "cud")
        'foo'= "bar" 
        }
    

    output:

    {
        "baz":  "quuz",
        "cow":  [
                    "moo",
                    "cud"
                ],
        "foo":  "bar"
    }
    
    0 讨论(0)
  • 2020-12-03 05:13

    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
    }
    
    0 讨论(0)
提交回复
热议问题