我是Powershell的新手,在做一些我认为可能很简单的事情时遇到了麻烦,但到目前为止运气不佳。
我有一个数组,里面有两个对象。它看起来基本上是这样的:
[
{
"name":"John",
"age":30,
...
...
},
{
"score":null,
"vehicle":"Camaro",
"engine":"V8",
...
...
}
]
我的目标是更新第二个对象中的分数值。当键的值已经以字符串的形式存在时,我很幸运地做到了这一点,但我不明白为什么当键存在但值为null时(如上所示(,我无法实现这一点。
我试着使用一个功能,我在搜索之前发布的问题时了解到了这个功能,试图做类似的事情:
在PowerShell 中按名称设置嵌套对象属性的值
这个问题的函数如下:
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
属性的值考虑JSON将始终相同,这意味着数组的element 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