要使用REST API,我必须传递一个如下所示的JSON对象:
{ "series" :
[{
"metric": "custom.powershell.gauge",
"points":[[1434684739, 1000]]
}
]
}
注意这里的嵌套数组。我无法重现这一点。这是我的代码:
[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
这是输出:
{"series":[{"points":[1434685292,95],"metric":"custom.powershell.gauge"}]}
我尝试了很多东西,我无法让2个数组嵌套,它总是看起来像一个数组。
在同一张纸条上,请有人解释一下:
> $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
}
]
这些value
和Count
来自哪里?
感谢您的帮助。
答案 0 :(得分:12)
解释是(1,2),(3,4
)是一个数组数组,但是Powershell将第一个级别与管道|
分开,并且您没有为这些数组命名,因此序列化程序提供它。首先尝试一下:
# 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
它提供了第一步:
{"value":[[1,2],[3,4]],"Count":2}
{"points":[[1,2],[3,4]]}
现在我建议的解决方案:
# 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
对我而言,它可以提供您所需要的东西:
{
"series": [
{
"points": [
[
1,
2
],
[
3,
4
]
],
"metric": "custom.powershell.gauge"
}
]
}
答案 1 :(得分:2)
晚会,但我想提出一个更易于扩展的视觉直观解决方案(我和其他人一样,是一个视觉学习者,因此下面的代码块可以帮助我更轻松地理解事物):
[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
输出:
{
"series": [
{
"metric": "custom.powershell.gauge",
"points": [
[
1473698742,
96
]
]
}
]
}
-Depth 4
为您提供围绕您的点值的附加方括号,[Ordered]
确保哈希表按原始指定排序。在发送之前不要忘记-Compress
,就像其他人说的那样。
答案 2 :(得分:1)
正如JPBlanc建议的那样,创建一个自定义对象是有效的。以下是我的代码:
[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
哪个输出:
{"series":[{"points":[[1434810163,53]],"metric":"custom.powershell.gauge"}]}
不要忘记指定深度> 2.
谢谢!