从一个JSON中提取Object值并附加到另一个JSON中的同一Object

r6l8ljro  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

我有两个结构相似的JSON,如下所示。我想从第一个JSON中提取“Jobs”对象下的所有键/值,并将其插入到同一个“Jobs”对象下的第二个JSON中。我已经能够从两个JSON中提取和合并“Jobs”,但我无法解决如何更新第二个JSON内联以具有组合的“Jobs”并保留现有的父对象,而不是“到目前为止,我已经发布了我的PS脚本。对于如何做到这一点有什么建议吗?
注意:JSON第一行中的DBM* 属性名并不总是以DBM开头。

第一个JSON

{
  "DBM0003": {
  "Type":  "Folder",
  "ControlmServer": "vl-aus-dbaqa001",
  "ActiveRetentionPolicy": "CleanEndedOK",
  "SubApplication": "VSAUSUBAPP",
  "CreatedBy": "emuser",
  "Application": "VSAUAPP",
  "Jobs": [
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "hostname",
      "Name": "DBMAU001",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU001-273"
          }
        ]
      },
      "eventsToAdd": {
        "Type": "AddEvents",
        "Events": [
          {
            "Event": "DBMAU001-TO-DBMAU002-341"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU001-273"
          }
        ]
      }
    },
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "cat $HOME/installed-versions.txt",
      "Name": "DBMAU002",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "DBMAU001-TO-DBMAU002-341"
          }
        ]
      },
      "eventsToAdd": {
        "Type": "AddEvents",
        "Events": [
          {
            "Event": "DBMAU002-TO-DBMAU003-341"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "DBMAU001-TO-DBMAU002-341"
          }
        ]
      }
    },
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "cat $HOME/installed-versions.txt",
      "Name": "DBMAU003",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "DBMAU002-TO-DBMAU003-341"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "DBMAU002-TO-DBMAU003-341"
          }
        ]
      }
    }
  ],
  "When": {
    "RuleBasedCalendars": {
      "Included": [
        "CAP_0001"
      ],
      "CAP_0001": {
        "Type": "Calendar:RuleBased",
        "When": {
          "DaysRelation": "OR",
          "WeekDays": [
            "NONE"
          ],
          "MonthDays": [
            "ALL"
          ]
        }
      }
    }
  }
  }
}

字符串

第二个JSON

{
  "DBM0002": {
  "Type":  "Folder",
  "ControlmServer": "vl-aus-dbaqa001",
  "ActiveRetentionPolicy": "CleanEndedOK",
  "SubApplication": "VSAUSUBAPP",
  "CreatedBy": "emuser",
  "Application": "VSAUAPP",
  "Jobs": [
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "hostname",
      "Name": "DBMAU004",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU004"
          }
        ]
      },
      "eventsToAdd": {
        "Type": "AddEvents",
        "Events": [
          {
            "Event": "DBMAU004-TO-DBMAU005"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU004"
          }
        ]
      }
    },
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "hostname",
      "Name": "DBMAU004",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU004"
          }
        ]
      },
      "eventsToAdd": {
        "Type": "AddEvents",
        "Events": [
          {
            "Event": "DBMAU004-TO-DBMAU005"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "CAPU003-TO-DBMAU004"
          }
        ]
      }
    },
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "cat $HOME/installed-versions.txt",
      "Name": "DBMAU005",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "DBMAU004-TO-DBMAU005"
          }
        ]
      },
      "eventsToAdd": {
        "Type": "AddEvents",
        "Events": [
          {
            "Event": "DBMAU005-TO-DBMAU006"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "DBMAU004-TO-DBMAU005"
          }
        ]
      }
    },
    {
      "Type": "Job:Command",
      "SubApplication": "VSAUSUBAPP",
      "CreatedBy": "emuser",
      "Description": "Test Job",
      "RunAs": "ctmagent",
      "Application": "VSAUAPP",
      "Command": "cat $HOME/installed-versions.txt",
      "Name": "DBMAU006",
      "When": {
        "WeekDays": [
          "NONE"
        ],
        "MonthDays": [
          "ALL"
        ],
        "DaysRelation": "OR",
        "RuleBasedCalendars": {
          "Relationship": "AND",
          "Included": [
            "CAP_0001"
          ]
        }
      },
      "eventsToWaitFor": {
        "Type": "WaitForEvents",
        "Events": [
          {
            "Event": "DBMAU005-TO-DBMAU006"
          }
        ]
      },
      "eventsToDelete": {
        "Type": "DeleteEvents",
        "Events": [
          {
            "Event": "DBMAU005-TO-DBMAU006"
          }
        ]
      }
    }
  ],
  "When": {
    "RuleBasedCalendars": {
      "Included": [
        "CAP_0001"
      ],
      "CAP_0001": {
        "Type": "Calendar:RuleBased",
        "When": {
          "DaysRelation": "OR",
          "WeekDays": [
            "NONE"
          ],
          "MonthDays": [
            "ALL"
          ]
        }
      }
    }
  }
  }
}

PS脚本

$sourcejson = Get-Content 'DBM0002.json' | ConvertFrom-Json
$destjson = Get-Content 'DBM0003.json' | ConvertFrom-Json

$sourcefolder = $sourcejson.PsObject.Properties.Name
$sourcejobs = $sourcejson.$($sourcefolder).Jobs
$sourcejobsjson = $sourcejobs | ConvertTo-Json -Depth 99
$sourcejobsnames = $sourcejson.$($sourcefolder).Jobs.Name
$sourcejobscount = $sourcejson.$($sourcefolder).Jobs.Name.Count

$destfolder = $destjson.PsObject.Properties.Name
$destjobs = $destjson.$($destfolder).Jobs
$destjobsjson = $destjobs | ConvertTo-Json -Depth 99
$destjobsnames = $destjson.$($destfolder).Jobs.Name
$destjobscount = $destjson.$($destfolder).Jobs.Name.Count

$destjobs += $sourcejobs
$destjobs | ConvertTo-Json -Depth 99 | Add-Content -Path Combined.json

$sourcejson = Get-Content 'DBM0002.json' | ConvertFrom-Json
$destjson = Get-Content 'DBM0003.json' | ConvertFrom-Json

$sourcefolder = @($sourcejson.PsObject.Properties)[0].Name
$sourcejobs = @($sourcejson.PSObject.Properties)[0].Value.Jobs
$sourcejobsnames = @($sourcejson.PSObject.Properties)[0].Value.Jobs.Name
$sourcejobscount = @($sourcejson.PSObject.Properties)[0].Value.Jobs.Name.Count

$destfolder = @($destjson.PsObject.Properties)[0].Name
$destjobs = @($destjson.PSObject.Properties)[0].Value.Jobs
$destjobsnames = @($destjson.PSObject.Properties)[0].Value.Jobs.Name
$destjobscount = @($destjson.PSObject.Properties)[0].Value.Jobs.Name.Count

# Option 1
$destjobs += $sourcejobs
# Option 2
@($destjson.PSObject.Properties)[0].Value.Jobs += @(@($sourcejson.PSObject.Properties)[0].Value.Jobs)
# Option 3
@($destjson.PSObject.Properties)[0].Value.Jobs += @($sourcejson.PSObject.Properties)[0].Value.Jobs
$destjson | ConvertTo-Json -Depth 99 | Add-Content -Path Combined.json

Write-Host $sourcefolder","$sourcejobscount"," -NoNewline && Write-Host $sourcejobsnames -Separator ":"
Write-Host $destfolder","$destjobscount"," -NoNewline && Write-Host $destjobsnames -Separator ":"

0vvn1miw

0vvn1miw1#

如果我理解正确的话,那么你应该做的是合并Jobs数组**,然后**将它们转换回Json。还假设你正在尝试使用以下方法动态引用属性值:

$sourcefolder = $sourcejson.PsObject.Properties.Name
$sourcejobs = $sourcejson.$($sourcefolder).Jobs

字符串
也许这可以使用.Match来简化,考虑到属性名以DBM开头,您可以使用以下模式来获取值:

$sourcejobs = $sourcejson.PSObject.Properties.Match('DBM*').Value.Jobs


至于连接2个数组,您可以使用+=,使用简化版本的Jsons用于此演示:

$json1 = ConvertFrom-Json @'
{
  "DBM0003": {
    "Jobs": [
      {
        "Name": "Job1"
      }
    ]
  }
}
'@

$json2 = ConvertFrom-Json @'
{
  "DBM0004": {
    "Jobs": [
      {
        "Name": "Job2"
      }
    ]
  }
}
'@

$json2.PSObject.Properties.Match('DBM*').Value.Jobs +=
    @($json1.PSObject.Properties.Match('DBM*').Value.Jobs)
$json2 | ConvertTo-Json -Depth 99


如果不是所有的Jsons都有一个以DBM开头的属性,但是它们都是一个只有一个属性的对象,你可以做的是在索引0处获取属性值:

@($json2.PSObject.Properties)[0].Value.Jobs +=
    @(@($json1.PSObject.Properties)[0].Value.Jobs)
$json2 | ConvertTo-Json -Depth 99


这将导致以下JSON:

{
  "DBM0004": {
    "Jobs": [
      {
        "Name": "Job2"
      },
      {
        "Name": "Job1"
      }
    ]
  }
}

相关问题