Невозможно обновить значение после добавления члена в коллекцию массивов pscustomobject из преобразованного json - PullRequest
0 голосов
/ 04 апреля 2020

v5.1

Учитывая следующее json -> obj from convertfrom- json

$json = @"
{
    "key1":"value1",
    "key2":"value2",
    "key3":[
       "value3a","value3b","value3c"
    ],
    "key4":[
       {
          "id":"id1",
          "name":"name1"
       },
       {
          "id":"id2",
          "name":"name2"
       }
    ]
}
"@
$obj = ConvertFrom-Json -InputObject $json

Я добавляю новый элемент в массив key4, где коллекция является идентификатором = "id1" без каких-либо проблем, например

$rootKey = "key4"
$subKeyValue = "id1"

$newKey = "foo"
$newValue = "bar"

# declare the target collection to modify
$targetCollection=($obj.$rootKey.where{$_.id -eq $subKeyValue})

# if the property/member does not exist create it in the target collection
if (!($targetCollection.$($newKey))) {
   $targetCollection | Add-Member @{$newKey = $newValue}
}

Проблема возникает, когда я пытаюсь обновить этот же ключ в той же коллекции новым значением, очевидно, делая это неправильно, но я ожидал, что это сработает

$newValue = 'bar2'

$targetCollection.$newKey = $newValue # = ERROR: The property 'foo' cannot be found on this object   

$targetCollection.foo = $newValue # = ERROR: The property 'foo' cannot be found on this object  

$targetCollection | get-Member

Get-Member четко показывает NoteProperty 'foo', но, похоже, что-то не так с моим таргетингом или методом, который я использую.

1 Ответ

0 голосов
/ 04 апреля 2020

Итак, у вас есть набор объектов

$targetCollection[0].Foo = "bar"

Это будет работать

Также

$targetCollection= $obj.$rootKey | Where-Object{$_.id -eq $subKeyValue} | select -first 1

Решит проблему также.

Давайте рассмотрим типы

В вашем примере $targetCollection - это тип System.Collections.ObjectModel.Collection[System.Management.Automation.PSCustomObject]

В моем решении $targetCollection - это тип System.Management.Automation.PSCustomObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...