Nested arrays and ConvertTo-Json

json, powershell

Solution

The explanation is that `(1,2),(3,4`) is an array of array, but Powershell split the first level with the pipe `|`, and you don't give a name for these arrays so the serializer supplies it. First have a try to this :

# First build your array of array
$z = (1,2),(3,4)
# convert it to JSON using the ,
,$z | ConvertTo-Json -Depth 5 -Compress
[psobject]@{"points"=$z} | ConvertTo-Json -Depth 5 -Compress

It gives the first step:

{"value":[[1,2],[3,4]],"Count":2}
{"points":[[1,2],[3,4]]}

Now the solution I propose :

# First build your array of array
$z = (1,2),(3,4)

# Then build a PSCustom object
$a = [pscustomobject]@{"series" = ,@{"metric"="custom.powershell.gauge"; "points"=$z}}

# At the end convert it to JSON
# don't forget the **Depth** parameter (use **Compress** to retreive one line like above)
$a | ConvertTo-Json -Depth 5

For me it gives something close to what you need:

{
    "series":  [
                   {
                       "points":  [
                                      [
                                          1,
                                          2
                                      ],
                                      [
                                          3,
                                          4
                                      ]
                                  ],
                       "metric":  "custom.powershell.gauge"
                   }
               ]
}

Problem

To use a REST API, I must pass a JSON object that looks like this: ``` { "series" : [{ "metric": "custom.powershell.gauge", "points":[[1434684739, 1000]] } ] } ``` Note the nested array here. I cannot get to reproduce this. Here is my code: ``` [int][double]$unixtime=get-date ( (get-date).ToUniversalTime() ) -UFormat %s $obj=@{} $series=@{} $array=@() $points=@() $value=get-random -Minimum 0 -Maximum 100 $series.add("metric","custom.powershell.gauge") $points=@(@($unixtime, $value)) $series.add("points",$points) $obj.Add("series",@($series)) $json=$obj | ConvertTo-Json -Depth 30 -Compress $json ``` And here is the output: ``` {"series":[{"points":[1434685292,95],"metric":"custom.powershell.gauge"}]} ``` I've tried many things, I cannot get the 2 arrays to be nested, it always end up looking like a single array. On the same note, came someone explain this please: ``` > $a=(1,2) > $a 1 2 > $a | ConvertTo-Json [ 1, 2 ] > $b=($a,$a) > $b 1 2 1 2 > $b | ConvertTo-Json [ { "value": [ 1, 2 ], "Count": 2 }, { "value": [ 1, 2 ], "Count": 2 } ] ``` Where are these `value` and `Count` coming from? Thanks for your help.

Original source