存在密钥时在 Powershell 中更新 JSON 个具有 NULL 值的对象数组

Updating JSON Array of Objects with NULL Value in Powershell When Key is Present

我是 Powershell 的新手,在做一些我认为可能很简单的事情时遇到了困难,但到目前为止运气不好。

我有一个包含两个对象的数组。基本上是这样的:

[

{
"name":"John",
"age":30,
...
...
},
{
"score":null,
"vehicle":"Camaro",
"engine":"V8",
...
...
}

]

我的目标是更新第二个对象中的 score 值。当键的值已经作为字符串存在时,我很幸运地这样做了,但是我不明白为什么当键存在但值为 null 时我无法让它工作(如上所示)。

我尝试使用一个函数,我在搜索以前发布的问题时学到了类似的东西:

该问题的函数如下所示:

function SetValue($object, $key, $Value)
{
    $p1,$p2 = $key.Split(".")
    if($p2) { SetValue -object $object.$p1 -key $p2 -Value $Value }
    else { $object.$p1 = $Value }
}

并且可以这样调用:

SetValue -object $Obj -key $Key -Value $Value

我不确定该值是否为 NULL 为什么重要。它可以找到密钥,但如果它的值为 NULL,则什么都不做。

如果这已经存在,我深表歉意。 Powershell 与我以前使用过的任何东西都略有不同!任何帮助是极大的赞赏! :)

您的 JSON 字符串生成的对象是两个对象的数组:

$json = @'
[
  {
    "name":"John",
    "age":30,
  },
  {
    "score":null,
    "vehicle":"Camaro",
    "engine":"V8"
  },
]
'@ | ConvertFrom-Json

$json[0] # => Element 0 of the Array

name age
---- ---
John  30

$json[1] # => Element 1 of the Array

score vehicle engine
----- ------- ------
      Camaro  V8

正在更新 score 属性 Value JSON 将始终相同 ,意思是,数组的 元素 1 将始终具有 属性 就像:

$json[1].score = 'hello' # => Updating the property value

$json | ConvertTo-Json   # => Converting the array back to Json

[
  {
    "name": "John",
    "age": 30
  },
  {
    "score": "hello",
    "vehicle": "Camaro",
    "engine": "V8"
  }
]

另一方面,如果对象的排列不总是相同,您可以遍历数组的所有元素来搜索 属性,一旦找到,就更新它。例如:

# For each element of the array
foreach($object in $json) {
    # if this object has a property with name `score`
    # assign that `NoteProperty` to the variable `$prop`
    if($prop = $object.PSObject.Properties.Item('score')) {
        # update the Value of the `NoteProperty`
        $prop.Value = 'hello'
    }
}
$json | ConvertTo-Json # Convert it back