我正在尝试通过引用传递JSON,然后向其添加内容。例如,我希望得到同样的结果:
$json.commontokens.search.tokens.token += $newItem
我将$json
中的密钥保存在$jsonList
中的字符串列表中(因为密钥未知且可以更改)以构建$json.commontokens.search.tokens.token
:
$jPath = $json
foreach($item in $jsonList){
$jPath = $jPath.$item
}
因此,$jpath += $newItem
未对$json
进行更改(但适用于$jpath
)。所以我认为我需要通过引用来保持变化。像
function adder{
param(
[ref]$j
$stringList
)
if ($stringList -ne $null) {
$first = $stringList.first.value
$stringList.removefirst()
adder ([ref]$j.value.$first) $stringList
} else {
return $j
}
}
$jpath = adder ([ref]$json) $jsonList
$jpath.value += $newItem
同样,这适用于$jpath
,但$json
没有任何反应。当我尝试$jpath.value[70]
时,我得到了预期的答案,但$json[70]
不存在。事实上,我尝试了没有这个功能:
$jpath = [ref]$json.commontokens.search.tokens.token
$jpath.value += $newItem
但它仍然无效。我做的引用错了吗?或者它与钥匙有什么关系?
答案 0 :(得分:0)
所以,我真的不明白,但我设法让它发挥作用。 在加法器中,我从
更改了递归行([ref]$j.value.$first)
到
([ref]$($jvalue.value.$first))
我还添加了一个return
,以便更明显地进行递归。
出于某种原因,我仍然无法做$jpath.value += $newItem
;但是,从$token
移除$jpath
后,$jpath.value.token += $newItem
就可以了。
因此,我没有添加stringlist中的所有字符串,而是跳过了最后一个字符串。 Adder已更改为跳过最后一个字符串:
($stringList -ne $null)
已更改为
($stringList-ne $stringList.list.last)
其中$stringlist
实际上只是一个节点(我应该更改名称)。所以最终的代码是$jpath.value.($stringList.Last.value) += $newItem
。
我想我不能直接修改$jpath.value
?还是什么?