Powershell JSON 操作

2024-01-19

$parent = @"
{
    "Property1":  "Property1Value",
    "Description":  "Generic Description",
    "SubProperties":  {
                       
                       "SubSubTemplateProps": {
                                    SubSubSubTemplateProps1 : "SubSubSubTemplateProps1",
                                    SubSubSubTemplateProps2 : {
                                                                  SubSubSubSubTemplateProps1 : [
                                                                        {
                                                                            "Key":  "Name",
                                                                            "Value":  "Temp"
                                                                        },
                                                                        {
                                                                            "Key":  "SupSubSubProp2",
                                                                            "Value":  "Supprop2value"
                                                                        }
                                                                    ]
                                                            }
                            }
                   }
}
"@ | ConvertFrom-Json

$templateobj = $parent.SubProperties.SubSubTemplateProps

$parent.SubProperties.psobject.Properties.Remove("SubSubTemplateProps")


for($j = 0; $j -lt 3; $j++)
{
$i = "{0:D2}" -f ($j+1)
$letters = @("a","b","c")
    foreach($letter in $letters)
    {
        $newobject = $templateobj
        ($newobject.SubSubSubTemplateProps2.SubSubSubSubTemplateProps1 | ? {$_.key -eq "Name"}).Value = "NewValue$letter$i"
        $parent.SubProperties | Add-Member -MemberType NoteProperty -Name "SubSubProp$letter$i" -Value $newobject
    }

}
$parent |convertto-json -Depth 100

我期待这样的输出:

{
    "Property1":  "Property1Value",
    "Description":  "Generic Description",
    "SubProperties":  {
                          "SubSubPropa01":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValuea01"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropb01":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb01"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropa02":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValuea02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropb02":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            }
                      }
}

但我得到这样的输出,其中父级的所有 noteproperty 都被更新,而不仅仅是我添加的 noteproperty。什么?!

{
    "Property1":  "Property1Value",
    "Description":  "Generic Description",
    "SubProperties":  {
                          "SubSubPropa01":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropb01":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropa02":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            },
                          "SubSubPropb02":  {
                                                "SubSubSubTemplateProps1":  "SubSubSubTemplateProps1",
                                                "SubSubSubTemplateProps2":  {
                                                                                "SubSubSubSubTemplateProps1":  [
                                                                                                                   {
                                                                                                                       "Key":  "Name",
                                                                                                                       "Value":  "NewValueb02"
                                                                                                                   },
                                                                                                                   {
                                                                                                                       "Key":  "SupSubSubProp2",
                                                                                                                       "Value":  "Supprop2value"
                                                                                                                   }
                                                                                                               ]
                                                                            }
                                            }
                      }
}

有人可以建议如何复制节点并替换子值,然后将其添加回父节点而不覆盖所有其他子节点吗?不知道为什么会发生这种情况。


根本问题,如评论中所解释的以及更详细的这个相关答案 https://stackoverflow.com/a/58241314/45375 is:

  • [pscustomobject]实例,例如返回ConvertFrom-Json是 .NET 的实例参考类型, 意思就是$newobject = $templateobj不创建copy of the object存储在$templateobj in $newobject,它创建了一个副本参考反对$templateobj, 以便$templateobj and $newobject最终指向完全相同的物体。仅 .NET 实例值类型 are 他们自己通过简单的作业复制 - 请参阅这个答案 https://stackoverflow.com/a/71461078/45375了解背景信息。
    所以,您最终重复修改了同一个对象,而不是它的独立副本.

  • While $templateobj.psobject.Copy()是创建一个方便的方法shallow克隆(副本)[pscustomobject]实例,这对于您的情况来说是不够的,因为您的实例还包含对象的引用类型实例属性值,然后再次获得副本参考。 换句话说:你的模板对象是[pscustomobject] graph(嵌套),所以需要deep-克隆,没有内置方法。

    • Note: 如果你提前知道模板对象的结构, 有更简单、更高效的解决方案:

      • Use a literal [pscustomobject]对象定义在你的循环内,每次都会创建一个新实例 - 请参阅相关答案 https://stackoverflow.com/a/58241314/45375.

      • 将您的模板构建为有序的哈希表 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Hash_Tables ([ordered] @{ ... }),并将其投射到[pscustomobject]每次你在循环中需要一个新副本时 - 请参阅这个答案 https://stackoverflow.com/a/69827922/45375

      • 定义一个自定义class并在每次循环迭代中实例化它 - 请参阅这个答案 https://stackoverflow.com/a/44115554/45375.


If you do need 深度克隆[pscustomobject] graphs, use 辅助函数
Copy-PSCustomObject
,下面进一步定义,其中-Deep switch:

$newobject = Copy-PSCustomObject -Deep $templateobj

辅助功能Copy-PSCustomObject:

注意:这是not a generic深度克隆功能,适用于以下对象any类型(这是不可能实现的),但它应该与[pscustomobject]诸如返回的图表ConvertFrom-Json,这将它们的组成限制为:

  • 映射到原始 .NET 类型的原始 JSON 类型以及[string],所有这些都是 .NET值类型或者,在以下情况下[string]像他们一样行事。

  • Nested [pscustomobject]具有相同组成的实例。

  • Arrays任何一个。

function Copy-PSCustomObject {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory, ValueFromPipeline)]
    [PSCustomObject] $InputObject,
    [switch] $Deep
  )

  begin {
    if ($Deep) {
      # Helper script block (anonymous function) for walking the object graph
      $sb = {
        param($original)
        $copy = $original.psobject.Copy()
        foreach ($prop in $copy.psobject.Properties) {
          if ($prop.Value -is [System.Collections.IEnumerable]) { # Presumed array
            $prop.Value = @($prop.Value) # Clone array
            foreach ($i in 0..($prop.Value.Count-1)) {
              $prop.Value[$i] = & $sb $prop.Value[$i] # Recurse
            }
          }
          elseif ($prop.Value -is [System.Management.Automation.PSCustomObject]) {
            $prop.Value = & $sb $prop.Value # Recurse
          }
          # Otherwise: assume it is a value type or string and needs no cloning.
        }
        # Output the deep-cloned object
        $copy
      }  
    }

  }

  process {
    if ($Deep) {
      & $sb $InputObject
    }
    else {
      # Shallow copy.
      $InputObject.psobject.Copy()
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell JSON 操作 的相关文章

随机推荐

  • mysql查询结果在php变量中

    有没有办法将mysql结果存储在php变量中 谢谢 query SELECT username userid FROM user WHERE username admin result conn gt query query 然后我想打印从
  • 如何在 Django 中制作类似于 stackoverflow 的 URL?

    我正在创建一个视频网站 我希望视频的直接网址看起来像 example com watch this is a slug 1 其中 1 是视频 ID 但我不想让蛞蝓变得重要 example com watch this is another
  • MVVM 独特的优势

    stackoverflow 搜索将导致多个包含相似标题的帖子 但这是不同的问题 由于这不是一个讨论网站 我必须问一个不同的问题 使用 MVVM 可以给我带来哪些其他实现无法带来的独特好处 MVC NTiers 或其他任何东西 我并不是真正在
  • C# 如何将 System.Net.ConnectStream 转换为 byte[] (数组)

    我正在尝试将流 System Net ConnectStream 转换为字节数组 关于如何做到这一点的任何想法 示例 Stream sourceStream the ConnectStream byte array using var ms
  • 如何在 REST Assured 中设置请求超时?

    我正在发送带有 REST Assured 的帖子请求 问题是它根本没有超时 就我而言 服务器有时无法访问 这会永远锁定请求 找到了答案 我将其发布在这里 希望对某人有所帮助 RestAssured config RestAssuredCon
  • 用颜色绘制 SKPhysicsBody 的形状

    使用 SpriteKit 创建游戏 效果非常好 我正在使用物理学并且能够看到我的身体实际上在哪里 因为我的精灵里面可能有一些阿尔法 这真的会很有帮助 这也将有助于创建更精确的身体 在 SpriteKit 的文档中 他们讨论了 debugOv
  • 如何将 .Net 日期时间转换为 T-SQL 日期时间

    MyDataSource SelectParameters startDate DefaultValue fromDate SelectedDate Date ToString 如您所见 我正在 Net SqlDataSource 中设置参
  • 从自定义中间件(外部身份提供商)重定向期间未传递登录 ID

    我们希望在身份服务器中有一个外部身份提供商 用户被重定向到登录到此外部身份提供商 Idp 并在那里完成身份验证 外部 Idp 将响应重定向回我们的身份服务器 我们希望在其中根据响应形成用户声明并重定向回调用客户端 我们遵循了答案这个计算器问
  • Oracle 多次更新查询

    我的数据库中有两张如下表所示的表 在每个 DEPARTMENT CODE 的第一个表 ITEM 中 将有多个 ITEM CODE ITEM STORE CODE ITEM CODE DEPARTMENT CODE 011 912003 14
  • 如何在 IntelliJ 中执行外部工具

    我在哪里可以实际启动 IntelliJ 中的外部工具 我知道在哪里设置外部工具 并且我已经完成了 但我看不到在哪里启动它 我没有从 运行 菜单中看到它 也没有从任何右键单击菜单中看到它 您可以使用 JetBrains 的命令行工具支持插件从
  • select/poll 与异步 I/O 的性能

    从性能角度来看 哪一个更好 选择 轮询还是异步 I O 我之前的印象是 select poll 反复向内核请求数据 而异步 I O 则依赖于内核通知数据可用性 但是 我注意到 select poll 也依赖于内核通知 因此 我相信从性能的角
  • 如何在Python中转义撇号等?

    我有一个带有这样的符号的字符串 39 这显然是一个撇号 我尝试了 saxutils unescape 但没有任何运气 并尝试了 urllib unquote 我怎样才能解码这个 谢谢 查看这个问题 https stackoverflow c
  • C#、XML、添加新节点

    我正在尝试向现有 XML 文件添加新节点 我有这个文件 其中包含第一个测试元素
  • 无法访问 Azure Functions 的管理 URL

    我正在使用 powershell 并尝试访问 Azure 函数行政使用 API 我正在尝试获取在 appName 下创建的所有函数的列表 当然 我在调用之前将 appName 更改为实际的 Azure 函数名称 在这次通话之前我也得到了有效
  • Office Dialog API 向子对话框发送消息

    我们希望使用 Dialog API 进行一些更适合更大工作区域的额外操作 我们已经能够通过 API 从对话框中向家长发送消息 Office context ui messageParent 但是我们还希望能够直接向对话框发送消息 例如sen
  • 切换主题后如何保留我的(自定义)IDE 配色方案?

    Delphi Rio comes with two color schemes dark and light I open Tools gt Options gt Editor gt Color and changed the dark c
  • 弹跳球。使其在高峰时减速

    我在 x3d 中创建了一个弹跳球动画 我只是好奇如何让球在其高度的峰值处减速 使其看起来更真实 先感谢您
  • Nodejs 中工作线程如何工作?

    Nodejs 不能像 java 和 net 那样有内置的线程 API 做 如果添加线程 语言本身的性质就会 改变 无法将线程添加为一组新的可用线程 类或函数 Nodejs 10 x 添加了工作线程作为实验 现在从 12 x 开始稳定 我浏览
  • CSS 编辑器,可扩展编辑时的单行声明

    是否有一个 CSS 编辑器可以自动将单行声明扩展为焦点上的多行声明 为了澄清我的想法 请参阅下面的示例 原始CSS div main color orange margin 1em 0 border 1px solid black 但是当关
  • Powershell JSON 操作

    parent Property1 Property1Value Description Generic Description SubProperties SubSubTemplateProps SubSubSubTemplateProps