【发布时间】:2015-06-04 21:55:45
【问题描述】:
我今天正在做一些事情,在测试过程中我发现了一个非常奇怪的问题
$arry = @()
$Msg = @{Body="This is a Sample Message";}
$Msg.BrokerProperties=@{}
$Msg.BrokerProperties.Label= "Msg1"
$arry += $Msg
$arry | ConvertTo-Json # 1st Result
$Msg.BrokerProperties=@{}
$Msg.BrokerProperties.Label= "Msg2"
$arry += $Msg
$arry | ConvertTo-Json
$arry | ConvertTo-Json的第一个结果如下
{ "Body": "这是一个示例消息", “经纪人属性”:{ “标签”:“Msg1” } }
$arry | ConvertTo-Json的第二个结果如下
[ { "Body": "这是一个示例消息", “经纪人属性”:{ “标签”:“Msg2” } }, { "Body": "这是一个示例消息", “经纪人属性”:{ “标签”:“Msg2” } } ]
我认为会发生的是,当我第二次设置 $Msg.BrokerProperties.Label= "Msg2" 时,它只会影响数组中的 2nd hashtable。但非常有趣的是,该属性甚至被注入到第一个哈希表中。
有人可以解释一下这种行为吗?
我实际上是在循环中执行此操作以准备 JSON 有效负载以发送到 API 调用,因此我正在寻找一种方法来更新 json 对象中每个内部的标签
【问题讨论】:
-
将数组追加操作更改为
$arry += ,$Msg会改变行为吗? -
不,我现在开始意识到数组是引用类型(不是值类型)
-
当我逐行尝试以下内容时,Label 属性在我输出时已经在 $msg 中 $arry = @() $Msg = @{Body="This is a Sample Message";BrokerProperties =@{Priority="Medium"}} $Msg1 = $Msg $Prp = $Msg1.Get_Item("BrokerProperties") $Prp.Add("Label","Msg1") $arry += $Msg1 $Msg2 = $消息 $Msg2 | ConvertTo-Json
标签: powershell