2015-04-30 72 views
1

我試圖使用PowerShell將數據推送到REST API。Powershell創建數組陣列

http://influxdb.com/docs/v0.8/api/reading_and_writing_data.html

服務器數據像這樣預計:

[ 
    { 
    "name" : "hd_used", 
    "columns" : ["value", "host", "mount"], 
    "points" : [ 
     [23.2, "serverA", "mnt"] 
    ] 
    } 
] 

然而,我「米只能夠使一個JSON對象,看起來像這樣(注意額外的引號):

[ 
    { 
    "name" : "hd_used", 
    "columns" : ["value", "host", "mount"], 
    "points" : [ 
     "[23.2, "serverA", "mnt"]" 
    ] 
    } 
] 

我該如何構造數據到數組中,而不用將數組嵌套在引號中?

這工作,但它不是一個嵌套的數組

$influxdata = [ordered]@{} 
$influxdata.name = $hd_used 
$influxdata.columns = @("value", "host", "mount") 
$influxdata.points = @() 
$influxdata.points += @("23.2", "serverA", "mnt") 
$influxdatajson = $influxdata | ConvertTo-Json -Depth 2 

這工作,但內部數組實際上是一個字符串。

$influxdata = [ordered]@{} 
$influxdata.name = $hd_used 
$influxdata.columns = @("value", "host", "mount") 
$influxdata.points = @() 
$influxdata.points += @('["23.2", "serverA", "mnt"]') 
$influxdatajson = $influxdata | ConvertTo-Json -Depth 2 
+0

你使用的是什麼版本的PowerShell?這不是我用那個輸入從'ConvertTo-Json'得到的輸出。 –

回答

5

隨着$PSVersion.$PSVersion等於3.0和你確切輸入我得到如下當我打印的$influxdatajson變量:

{ 
    "name": "hd_used", 
    "columns": [ 
        "value", 
        "host", 
        "mount" 
       ], 
    "points": [ 
        "23.2", 
        "serverA", 
        "mnt" 
       ] 
} 

這顯然不是你想要的,但不是你說你也有。

這是我們得到的輸出的原因是因爲嘗試將數組添加到現有數組中並沒有按照您期望的方式工作,因爲powershell展開數組的煩人傾向(我認爲)。

如果你工作周圍的古怪通過使用此語法來代替:

$influxdata.points += ,@("23.2", "serverA", "mnt") 

(領導,強制數組上下文,以便使外數組被代替展開您要添加的數組)

然後我從$influxdatajson得到以下輸出:

{ 
    "name": "hd_used", 
    "columns": [ 
        "value", 
        "host", 
        "mount" 
       ], 
    "points": [ 
        [ 
         "23.2", 
         "serverA", 
         "mnt" 
        ] 
       ] 
} 
1

補充Etan Reisner's helpful answer(使用一元,的,其創建嵌套陣列解決了這個問題):

Powershell的哈希表文字是相對於相當的靈活性,以摻入變量引用,表達和命令,這使得一個更可讀的溶液:

,, [ordered] @{ 
    name = 'hd_used' 
    columns = 'value', 'host', 'mount' 
    points = , (23.2, 'serverA', 'mnt') 
} | ConvertTo-Json -Depth 3 

這產生了:

[ 
    { 
    "name": "hd_used", 
    "columns": [ 
     "value", 
     "host", 
     "mount" 
    ], 
    "points": [ 
     [ 
     23.2, 
     "serverA", 
     "mnt" 
     ] 
    ] 
    } 
] 

注意如何陣列施工操作者(,)在管道的開始處被施加兩次[ordered]前):

  • 第一個把所述有序哈希表入(單項目)陣列,
  • 和第二時間來包裝數組中的一個外部陣列。

通過管道使得PowerShell的解包任何集合,即發送的結果,枚舉集合的項目,以及一個,在這種情況下除掉外陣列發送它們一個,根據需要留下ConvertTo-Json來處理內部陣列。
請注意,傳遞數組會爲層次結構添加一個級別,這就是爲什麼-Depth的值增加到上面的。

  • 買者任何屬性,其層次水平深度超過-Depth字符串化(評價爲如果放在裏面"$(...)"),其在陣列的情況下將簡單地加入用空間陣列元件;例如,數組23.2, 'serverA', 'mnt'將變成具有文字內容23.2 serverA mnt的單個字符串。

注意陣列上面怎麼辦使用語法@(...),因爲它通常是沒有必要構建陣列和實際上是效率較低:只要, -enumerate的元素,並且,如果必要的話,請用(...)優先(儘管@()在語法上方便創建數組)。

+使用數組作爲LHS沒有那麼多展開(披)的RHS,但會連接陣列,或者換種方式,讓你追加多個個別項目;例如: -

$a = 1, 2 
$a += 3, 4 # add elements 3 and 4 to array 1, 2 to form array 1, 2, 3, 4 

注意的是,使用+=實際創建幕後數組,因爲數組是不可調整大小。