下面是我要引用的JSON文件。
{
"@odata.context": "https://ac.com/odata/$metadata#ModelVariableDataTypes(Id,ModelVariable,DoubleValues,ModelVariable(Id,Name,UnitOfMeasure,UnitOfMeasure(Name,Abbreviation)),DoubleValues(Id,Value,Timestamp,DataQuality,DataQuality(Id,Name)))",
"@odata.count": 1,
"value": [
{
"Id": 1928155,
"ModelVariable": {
"Id": 1929663,
"Name": "AccCore_CPULoadProcess",
"UnitOfMeasure": {
"Name": "%",
"Abbreviation": "%"
}
},
"DoubleValues": [
{
"Id": 75865549,
"Value": 0.0,
"Timestamp": "2018-09-25T03:35:00Z",
"DataQuality": {
"Id": 1,
"Name": "Good"
}
},
{
"Id": 75865729,
"Value": 0.0,
"Timestamp": "2018-09-25T03:40:00Z",
"DataQuality": {
"Id": 1,
"Name": "Good"
}
},
{
"Id": 75865873,
"Value": 0.0,
"Timestamp": "2018-09-25T03:45:00Z",
"DataQuality": {
"Id": 1,
"Name": "Good"
}
}
]
}
]
}
我想从odata URL中提取JSON文件中的数据,但是我无法使用循环来提取内容,因为在JSON文件中,odata计数被称为1(@ odata.count“:1),所以当我尝试使用循环捕获全部数据时,它不起作用。
我想提取存在于doublevalues数组字段中的数据,并希望显示CPU进程的前三个值的输出。
我正在尝试使用以下代码来提取JSON数据。
$path= "C:\Users\s.papolu\Desktop\mem.json"
$data = Get-Content -Path 'C:\Users\S.Papolu\Desktop\mem.json' | ConvertFrom-Json
$maxCount = $data.'@odata.count'
$maxCount
@"
for ($i = 0; $i -lt $maxCount; $i++)
{
$Name = $("{0:N1}" -f $data.value.ModelVariable.Name)
$cpu = $("{$i`:N2}" -f $data.value.DoubleValues.Value)
}
write-host $Name,$cpu
答案 0 :(得分:1)
我不太确定您在这里问什么。一方面,您在其中有多余的符号和双引号。
MaxCount在这里仅为1,因此循环仅运行一次。但是,对于每个项目,您是否尝试将结果存储在某种结构中然后显示出来?您想要哪个DoubleValues?前三名?
这是您想要的 closeer 吗?
$data = Get-Content -Path $path | ConvertFrom-Json
$maxCount = $data.'@odata.count'
$maxCount
$results = @()
for ($i = 0; $i -lt $maxCount; $i++)
{
# get the top three doubles values
$Doubles = @($data.value[$i].DoubleValues | sort -Property Value -Descending | select -first 3)
$results += [PsCustomObject]@{
Name = $data.value[$i].ModelVariable[0].Name;
Cpu = $Doubles;
}
}
$results | ft