I have to merge 2 jsons files in powershell but I'm having problems when it comes to a list
$j1 = Get-Content 'json1.json' | Out-String | ConvertFrom-Json
$j2 = Get-Content 'json2.json' | Out-String | ConvertFrom-Json
function Join-Objects($source, $extend){
if($source.GetType().Name -eq "PSCustomObject" -and $extend.GetType().Name -eq "PSCustomObject"){
foreach($Property in $source | Get-Member -type NoteProperty, Property){
if($null -eq $extend.$($Property.Name)){
continue;
}
$source.$($Property.Name) = Join-Objects $source.$($Property.Name) $extend.$($Property.Name)
}
}else{
$source = $extend;
}
return $source
}
function AddPropertyRecurse($source, $toExtend){
if($source.GetType().Name -eq "PSCustomObject"){
foreach($Property in $source | Get-Member -type NoteProperty, Property){
if($null -eq $toExtend.$($Property.Name)){
$toExtend | Add-Member -MemberType NoteProperty -Value $source.$($Property.Name) -Name $Property.Name `
}
else{
$toExtend.$($Property.Name) = AddPropertyRecurse $source.$($Property.Name) $toExtend.$($Property.Name)
}
}
}
return $toExtend
}
function Merge-Json($extend, $source){
$merged = Join-Objects $extend $source
$extended = AddPropertyRecurse $source $merged
return $extended
}
Merge-Json $j1 $j2 | ConvertTo-Json -Depth 10
This is json1.file
{
"AppConfig": {
"Host": {
"JobServer3Camadas": "true",
"Port": "8050",
"ApiPort": "8051",
"HttpPort": "8051"
},
"RM": {
"JobServer3Camadas": "true",
"ActionsPath": "D:\\totvs\\CorporeRM\\RM.Net;D:\\totvs\\CorporeRM\\Corpore.Net\\Bin",
"LibPath": "D:\\totvs\\CorporeRM\\RM.Net"
},
"Portal": {
"JobServer3Camadas": "true",
"ActionsPath": "D:\\totvs\\CorporeRM\\RM.Net;D:\\totvs\\CorporeRM\\Corpore.Net\\Bin",
"LibPath": "D:\\totvs\\CorporeRM\\RM.Net"
}
},
"DbConfig": {
"AppServer": [
{
"Alias": "rapha139686",
"DbType": "SqlServer"
}
],
"JobServer": [
{
"Alias": "rapha139686",
"DbType": "SqlServer"
}
]
}
}
An this is the json2 file
{
"AppConfig": {
"Host": {
"Teste": "AAA",
"JobServer3Camadas": "false"
},
"RM": {
"Teste": "AAA",
"JobServer3Camadas": "false"
},
"Portal": {
"Teste": "AAA",
"JobServer3Camadas": "false"
}
},
"DbConfig": {
"AppServer": [
{
"Alias": "teste"
}
],
"JobServer": [
{
"Alias": "teste"
}
]
}
}
When the code runs I have the following return, on AppConfig the output is Ok, Teste tag is created and JobServer3Camadas changed. The problem occours on DbConfig returning:
{
"AppConfig": {
"Host": {
"JobServer3Camadas": "false",
"Port": "8050",
"ApiPort": "8051",
"HttpPort": "8051",
"Teste": "AAA"
},
"RM": {
"JobServer3Camadas": "false",
"ActionsPath": "D:\\totvs\\CorporeRM\\RM.Net;D:\\totvs\\CorporeRM\\Corpore.Net\\Bin",
"LibPath": "D:\\totvs\\CorporeRM\\RM.Net",
"Teste": "AAA"
},
"Portal": {
"JobServer3Camadas": "false",
"ActionsPath": "D:\\totvs\\CorporeRM\\RM.Net;D:\\totvs\\CorporeRM\\Corpore.Net\\Bin",
"LibPath": "D:\\totvs\\CorporeRM\\RM.Net",
"Teste": "AAA"
}
},
"DbConfig": {
"AppServer": {
"Alias": "teste"
},
"JobServer": {
"Alias": "teste"
}
}
}
And this is the expected response:
"DbConfig": {
"AppServer": [
{
"Alias": "teste",
"DbType": "SqlServer"
}
],
"JobServer": [
{
"Alias": "teste",
"DbType": "SqlServer"
}
]
}
PSCustomObjecttypes, but also for arrays. On a side note, use the-isoperator instead of comparing type names, e. g.if($source -is [PSCustomObject])orif($source -is [IList])for arrays. This is for clarity and makes the type checks more general, because the expression will be$truefor derived objects too.