Как выполнить итерацию ответа HTTP JSON, если структура неизвестна с помощью PowerShell? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь перебрать некоторые JSON, когда точная структура неизвестна.

Это JSON выглядит так:

"object" : { 
     "Item1" : { 
           "property1" : "a"
           "property2" : "b"
           }
       }
      "Item2" : { 
           "property1" : "c"
           "property2" : "d"
           }
       }
  }

Проблема в том, что я не знаю, каким будет настоящее имя Item1 или Item2. Это строка буквенно-цифровых символов c, которая различается для каждого вызова.

Я пробовал

$json_response = $response.object
foreach($item in $json_response) { 
   $id = $item.property1
   Write-Host $id
}

Однако значение $ id никогда не устанавливается равным значению proprty1. Write-Host всегда выводит пустую строку.

Если я просто сделаю

Write-Host $json_response

, я получу что-то вроде

@{Item1=; item2=}

Я подумал, что это может быть таблица ha sh, которая позволит мне перебирать его с помощью ключей, но нет свойства Keys.

Может кто поможет?

Обновление: ответ Lee_Dailey продвинул меня дальше, но все еще не могу получить доступ к свойствам. С помощью Lee_Dailey я придумал следующее:

        foreach ($item in $response_json.PSobject.Properties) { 
                 $json2 = $item | ConvertTo-Json
                 Write-Host $json2
        }

Это создает следующее JSON

{
"Value":  {
              "property1":  "a",
              "property2":  "b"
           }
 }

Однако я все еще не могу получить доступ к property1. Выполнение

$id = json2.Value.property1 
Write-Host $id

приводит к пустому значению. Как мне получить доступ к свойствам в JSON в переменной $ json2?

Обновление 2. Думаю, у меня все заработало, но не знаю, правильно это или хак. Обновление приведенного выше кода до

$json2 = $item | ConvertTo-Json | ConvertFrom-Json 

Кажется, позволяет мне сделать

$id = $json2.Value.property1

Я не уверен, откуда взялось «Value». Это не часть ответа HTTP. Также кажется странным преобразовать в JSON, а затем преобразовать его обратно, однако это, похоже, раскрывает свойства.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я предполагаю, что json должен быть этим. Эти плохо структурированные объекты обычны. Вы можете l oop через свойства «объекта», используя либо .psobjects.properties, либо get-member. Кроме того, в более новых версиях powershell вы можете преобразовать json в хеш-таблицу и использовать свойство keys.

{
  "object": {
    "Item1": {
      "property1": "a",
      "property2": "b"
    }
  },
  "Item2": {
    "property1": "c",
    "property2": "d"
  }
}

См. Также: Итерация через JSON файл PowerShell

В идеальном мире это выглядело бы так. Но получается более подробный.

{
  "object": [
    {
      "name": "Item1",
      "value": [
        {
          "name": "property1",
          "value": "a"
        },
        {
          "name": "property2",
          "value": "b"
        }
      ]
    },
    {
      "name": "Item2",
      "value": [
        {
          "name": "property1",
          "value": "c"
        },
        {
          "name": "property2",
          "value": "d"
        }
      ]
    }
  ]
}

$a = cat file.json | convertfrom-json


$a.object

name  value
----  -----
Item1 {@{name=property1; value=a}, @{name=property2; value=b}}
Item2 {@{name=property1; value=c}, @{name=property2; value=d}}


$a.object.value                      

name      value
----      -----
property1 a
property2 b
property1 c
property2 d
0 голосов
/ 08 мая 2020

Ваш Json должен быть таким.

$json = '{
    "object": { 
        "Item1": { 
            "property1": "a",
            "property2": "b"
        },
        "Item2": { 
            "property1": "c",
            "property2": "d"
        }
    }
}'

Как Ли упоминал в комментариях, и вы пытались, вы можете использовать $obj.PSObject.Properties для перебора неизвестных свойств.

$jsonObj = $json | ConvertFrom-Json
$jsonObj.object.PSObject.Properties | % { Write-Host $_.Value.Property1 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...