Перебор объекта JSON

Мои навыки PS в лучшем случае заржавели. Но, по-видимому, наиболее подходящим инструментом является столкновение с пользователями в AD PS.

Мне нужно обновить некоторые свойства пользователя в нашем AD. Для этого я создал файл JSON (примерно так):

{
   "xyz" : {
      "title" : "Leerling Copernicus SG, klas: 2MH1A",
      "displayName" : "Student xyz",
      "surname" : "xyz"
   },
   "abc" : {
      "displayName" : "Student abc",
      "givenname" : "Student"
   }
}

На самом деле существует более 4000 пользователей, и свойства, которые нужно изменить, варьируются от пользователя к пользователю.

Некоторый поиск в Google показал мне, что я могу создать объект PS из этого файла, выполнив

$json = Get-Content -Path 'C:\somewhere\mutaties.json' -Raw|ConvertFrom-Json

после этого я ожидал, что смогу перебирать объект, например

foreach ($user in $json) {
  foreach ($property in $user) {
    // do something smart
  }
}

Но это совершенно не работает. На первой итерации кажется, что $user содержит весь объект.

Кроме того: как мне получить доступ к ключам учетной записи, таким как xyz и abc, и именам свойств?

Обновлено: вот что я придумал:

$jsonObject = Get-Content -Path 'C:\somewhere\mutaties.json' -Raw|ConvertFrom-Json

foreach ($user in $jsonObject.psobject.Properties) {
    $key =  $user.name
    $properties = $user.VALUE
    write-host $key

    foreach ($property in $properties.psobject.Properties) {
        $name = $property.Name
        $value = $property.VALUE
        write-host `t $name`t $value
    }
}

Не так сложно, как ответ, но мне это помогло.

🤔 А знаете ли вы, что...
PowerShell имеет встроенные средства для администрирования и мониторинга серверов и сетей.


50
1

Ответ:

Решено

Поскольку ваш Json представляет собой один объект, вам нужно будет выполнить перечисление свойств объекта, для этого вы можете получить доступ к .PSObject.Properties. Пример того, как вы можете подойти к своему коду:

foreach ($user in $json.PSObject.Properties) {
    $properties = @{}
    foreach ($property in $user.Value.PSObject.Properties) {
        $properties[$property.Name] = $property.Value
    }

    @{
        user       = $user.Name
        properties = $properties
    }
}

# Name                           Value
# ----                           -----
# properties                     {[surname, xyz], [displayName, Student xyz], [title, Leerling Copernicus SG, klas: 2MH1A]}
# user                           xyz
# properties                     {[givenname, Student], [displayName, Student abc]}
# user                           abc