我有两个结构相似的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 ":"
型
1条答案
按热度按时间0vvn1miw1#
如果我理解正确的话,那么你应该做的是合并
Jobs
数组**,然后**将它们转换回Json。还假设你正在尝试使用以下方法动态引用属性值:字符串
也许这可以使用
.Match
来简化,考虑到属性名以DBM
开头,您可以使用以下模式来获取值:型
至于连接2个数组,您可以使用
+=
,使用简化版本的Jsons用于此演示:型
如果不是所有的Jsons都有一个以
DBM
开头的属性,但是它们都是一个只有一个属性的对象,你可以做的是在索引0
处获取属性值:型
这将导致以下JSON:
型