使用Add-Member将子对象添加到对象时,如何正确地将Powershell对象持久保存到JSON?

时间:2015-06-29 15:37:02

标签: json powershell

我使用一些PowerShell代码遇到了一些挑战,这里展示了一个简化和消毒的版本:

$outer = ("{""Child"": {""Grandchild"": {}}}" | ConvertFrom-Json )
$inner = $outer.Child.Grandchild
$newId = [guid]::NewGuid();
$nested = ("{
    ""Id"": ""$newId"",
    ""Name"": ""The Name Goes Here""
}" | ConvertFrom-Json)

$memberNameToAdd = "Nested"
$inner | Add-Member -MemberType NoteProperty -Name $memberNameToAdd $nested

$inner | ConvertTo-Json | Out-file "inner.json"
$outer | ConvertTo-Json | Out-file "outer.json"

我面临的具体挑战是动态添加内部项目的持久化方式。 $ inner(发送到inner.json)的输出符合我的预期:

{
    "Nested":  {
        "Id":  "741b6810-000e-4461-8ab8-6573e0d0b4a7",
        "Name":  "The Name Goes Here"
        }
}

不幸的是,$ outer的输出序列化如下:

{
    "Child":  {
        "Grandchild":  {
            "Nested":  "@{Id=741b6810-000e-4461-8ab8-6573e0d0b4a7; Name=The Name Goes Here}"
         }
    }
}

显然,这会导致从文件序列化(使用ConvertFrom-Json)时无法再访问"嵌套"的属性。

我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

您的问题应该来自默认的Key = Convert.ToBase64String(provider.Key);类型:

depth

实际上默认情况下,它会在深度为3时停止解析,然后它会为您提供对象的$inner | ConvertTo-Json -Depth 6 | Out-file "inner.json" $outer | ConvertTo-Json -Depth 6| Out-file "outer.json" 值。