我想从odata网址提取JSON文件中存在的数据,但是我无法使用循环提取内容

时间:2018-09-25 11:43:52

标签: arrays json json.net powershell-v2.0 powershell-v3.0

下面是我要引用的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

1 个答案:

答案 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