存在密钥时在 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
我是 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