2015-06-19 14 views
6

Aby użyć REST API, muszę przekazać obiekt JSON, który wygląda tak:zagnieżdżone tablice i ConvertTo-Json

{ "series" : 
    [{ 
     "metric": "custom.powershell.gauge", 
     "points":[[1434684739, 1000]] 
    } 
    ] 
} 

Uwaga zagnieżdżona tablica tutaj. Nie mogę tego odtworzyć. Tu jest mój kodu:

[int][double]$unixtime=get-date ((get-date).ToUniversalTime()) -UFormat %s 
[email protected]{} 
[email protected]{} 
[email protected]() 
[email protected]() 
$value=get-random -Minimum 0 -Maximum 100 


$series.add("metric","custom.powershell.gauge") 
[email protected](@($unixtime, $value)) 
$series.add("points",$points) 
$obj.Add("series",@($series)) 

$json=$obj | ConvertTo-Json -Depth 30 -Compress 
$json 

I tu jest wyjście:

{"series":[{"points":[1434685292,95],"metric":"custom.powershell.gauge"}]} 

Próbowałem wielu rzeczy, nie mogę dostać 2 tablice być zagnieżdżona, to zawsze w końcu wygląda jak pojedyncza szyk.

Na tej samej notatki, przyszedł ktoś wyjaśnić to proszę:

> $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 
    } 
] 

Gdzie są te value i Count pochodzących z?

Dzięki za pomoc.

Odpowiedz

9

Wyjaśnienie jest takie, że) jest tablicą tablic, ale Powershell dzieli pierwszy poziom z rurą |, a nazwy tych tablic nie podaje się, aby serializator je dostarczył. Najpierw spróbować tak:

# 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 

Daje Pierwszy krok:

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

Teraz rozwiązanie proponuję:

# 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 

Dla mnie to daje coś podobnego do tego, co potrzebujesz:

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

Operator przecinka działa również z jedną zagnieżdżoną tablicą: '$ points =, @ ($ unixtime, $ value)' –

+0

Dzięki! Zagram z tym i zaktualizuję wątek. – simsaull

+0

Link do definicji parametru: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/convertto-json#-depth –

1

Jak zasugerował JPBlanc, tworzenie niestandardowego obiektu zadziałało. Poniżej jest mój kod:

[long]$value=Get-Random -Minimum 0 -Maximum 100 
$points=,@($unixtime, $value) 
$metricname="custom.powershell.gauge" 

$obj = [pscustomobject]@{"series" = ,@{"metric" = $metricname; "points"=$points}} 

$json=$obj | ConvertTo-Json -Depth 5 -Compress 

które wyjścia:

{"series":[{"points":[[1434810163,53]],"metric":"custom.powershell.gauge"}]} 

Nie zapomnij podać głębokość> 2.

Dzięki!

2

Późno na imprezę, ale chciałbym zaproponować bardziej intuicyjne wizualnie rozwiązanie, które jest łatwe do rozbudowy (ja, podobnie jak inni, jestem wizualnym uczniem, więc tak bloki kodu, jak poniżej, ułatwiają zrozumienie):

[int][double]$unixtime = Get-Date ((Get-Date).ToUniversalTime()) -UFormat %s 
$value = Get-Random -Minimum 0 -Maximum 100 
$body = @{ 
    'series' = @(
     [Ordered]@{ 
      'metric'='custom.powershell.gauge' 
      'points' = @(
       ,@($unixtime,$value) 
      ) 
     } 
    ) 
} 
ConvertTo-Json -InputObject $body -Depth 4 

Wyjścia:

{ 
    "series": [ 
        { 
         "metric": "custom.powershell.gauge", 
         "points": [ 
             [ 
              1473698742, 
              96 
             ] 
            ] 
        } 
       ] 
} 

-Depth 4 dostaje dodatkowy zestaw nawiasach kwadratowych wokół wartości punktowych i [Ordered] zapewnia, że ​​hashtable zarządza się, co pierwotnie określona. Nie zapomnij przed wysłaniem -Compress, jak powiedzieli inni.