Unexpected ConvertTo-Json results? Answer: it has a default -Depth of 2

convertto-json, depth, json, powershell

Solution

Answer

`ConvertTo-Json` has a `-Depth` parameter:

Specifies how many levels of contained objects are included in the JSON representation. The default value is 2.

Example

To do a full round-trip with a JSON file you need to increase the `-Depth` for the `ConvertTo-Json` cmdlet:

$Json | ConvertFrom-Json | ConvertTo-Json -Depth 9

TL;DR

Probably because `ConvertTo-Json` terminates branches that are deeper than the default `-Depth` (2) with a (.Net) full type name, programmers assume a bug or a cmdlet limitation and do not read the help or about. Personally, I think a string with a simple ellipsis (three dots: …) at the end of the cut off branch, would have a clearer meaning (see also: Github issue: 8381)

Why?

This issue often ends up in another discussion as well: Why is the depth limited at all?

Some objects have circular references, meaning that a child object could refer to a parent (or one of its grandparents) causing a infinitive loop if it would be serialized to JSON.

Take for example the following hash table with a `parent` property that refers to the object itself:

$Test = @{Guid = New-Guid}
$Test.Parent = $Test

If you execute: `$Test | ConvertTo-Json` it will conveniently stop at a depth level of 2 by default:

{
    "Guid":  "a274d017-5188-4d91-b960-023c06159dcc",
    "Parent":  {
                   "Guid":  "a274d017-5188-4d91-b960-023c06159dcc",
                   "Parent":  {
                                  "Guid":  "a274d017-5188-4d91-b960-023c06159dcc",
                                  "Parent":  "System.Collections.Hashtable"
                              }
               }
}

This is why it is not a good idea to automatically set the `-Depth` to a large amount.

Problem

Why do I get unexpected `ConvertTo-Json` results, why do I get values like `System.Collections.Hashtable` and/or why does a round-trip (`$Json | ConvertFrom-Json | ConvertTo-Json`) fail? Meta issue Stackoverflow has a good mechanism to prevent duplicate questions but as far as I can see there is no mechanism to prevent questions that have a duplicate cause. Take this question as a an example: almost every week a new question comes in with the same cause, yet it is often difficult to define it as a duplicate because the question itself is just a slightly different. Nevertheless, I wouldn't be surprised if this question/answer itself ends up as a duplicate (or off-topic) but unfortunately stackoverflow has no possibility to write an article to prevent other programmers from continuing writing questions caused by this “known” pitfall. Duplicates A few examples of similar questions with the same common cause: - PowerShell ConvertTo-Json does not convert Array as expected (yesterday) - Powershell ConvertTo-json with embedded hashtable - powershell “ConvertTo-Json” has messed json format output - Nested arrays and ConvertTo-Json - Powershell ConvertTo-JSON missing nested level - How to save a JSON object to a file using Powershell? - Cannot convert PSCustomObjects within array back to JSON correctly - ConvertTo-Json flattens arrays over 3 levels deep - Add an array of objects to a PSObject at once - Why does ConvertTo-Json drop values - How to round-trip this JSON to PSObject and back in Powershell - Issue with ConvertFrom-Json - … Different So, were does this “self-answered” question differ from the above duplicates? It has the common cause in the title and with that it might better prevent repeating questions due to the same cause.

Original source

Related problems