Skip to content

Use prettier formatting for ConvertTo-Json #2736

@Daniel15

Description

@Daniel15

The output from ConvertTo-Json is pretty ugly at the moment:

@{
  foo = @{
    first = 'a'
    second = 'bbbbbbbb'
  }
  barbarbarbar = @{
    first = 'a'
    second = 'bbbbbbbb'
  }
  dan = 15
} | ConvertTo-Json

Results in:

{
    "dan":  15,
    "foo":  {
                "second":  "bbbbbbbb",
                "first":  "a"
            },
    "barbarbarbar":  {
                         "second":  "bbbbbbbb",
                         "first":  "a"
                     }
}

The formatting is all over the place. On the other hand, pretty much every other JSON library will produce something like this:

{
  "dan": 15,
  "foo": {
    "second": "bbbbbbbb",
    "first": "a"
  },
  "barbarbarbar": {
    "second": "bbbbbbbb",
    "first": "a"
  }
}

The standard JSON.NET pretty printing (Newtonsoft.Json.Formatting.Indented) may be useful, as it formats the JSON "correctly".

This is my current workaround to properly formatting JSON in PowerShell, it's a bit messy though:

# Formats JSON in a nicer format than the built-in ConvertTo-Json does.
function Format-Json([Parameter(Mandatory, ValueFromPipeline)][String] $json) {
  $indent = 0;
  ($json -Split '\n' |
    % {
      if ($_ -match '[\}\]]') {
        # This line contains  ] or }, decrement the indentation level
        $indent--
      }
      $line = (' ' * $indent * 2) + $_.TrimStart().Replace(':  ', ': ')
      if ($_ -match '[\{\[]') {
        # This line contains [ or {, increment the indentation level
        $indent++
      }
      $line
  }) -Join "`n"
}

(usage is like $foo | ConvertTo-Json | Format-Json)

This looks consistent across both PowerShell 5 and 6

> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.14965.1001
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14965.1001
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      6.0.0-alpha
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   3.0.0.0
GitCommitId                    v6.0.0-alpha.12
CLRVersion
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Metadata

Metadata

Assignees

Labels

Issue-Enhancementthe issue is more of a feature request than a bugResolution-FixedThe issue is fixed.WG-Cmdletsgeneral cmdlet issues

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions