J'ai les entrées suivantes - 2 fichiers json, l'un est celui de base et le second contient les mêmes propriétés mais les valeurs différentes, je voudrais fusionner ces objets.

Par exemple:

{
  a:{
    b:"asda"
  }
  c: "asdasd"
}

Et le deuxième fichier:

{
  a:{
   b:"d"
  }
}

Et le résultat devrait être comme ceci:

{a:{b:"d"},c:"asdasd"}

Est-ce possible avec PowerShell?

4
Ihor Korotenko 7 août 2017 à 17:54

2 réponses

Join (Join-Object) n'est pas un CmdLet intégré

C'est une extension de la réponse de @ Mark qui revient également à travers les objets enfants.

function merge ($target, $source) {
    $source.psobject.Properties | % {
        if ($_.TypeNameOfValue -eq 'System.Management.Automation.PSCustomObject' -and $target."$($_.Name)" ) {
            merge $target."$($_.Name)" $_.Value
        }
        else {
            $target | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value -Force
        }
    }
}

merge $Json1 $Json2

$Json1
5
waxingsatirical 11 juil. 2018 à 11:00

Si vous connaissez les noms des éléments (selon votre exemple ci-dessus), vous pouvez le faire explicitement comme ceci:

$Json1 ='{
  a: {
    b:"asda"
  },
  c: "asdasd"
}
' | ConvertFrom-Json

$Json2 = '{
  a:{
   b:"d"
  }
}
' | ConvertFrom-Json


$Json1.a = $Json2.a

Résultat:

$Json1 | ConvertTo-Json

{
    "a":  {
              "b":  "d"
          },
    "c":  "asdasd"
}

Si vous cherchez quelque chose qui fusionnera les deux sans connaître le nom de clé explicite, vous pouvez faire quelque chose comme ce qui suit. Cela écrasera essentiellement toutes les propriétés du premier Json par celles du second Json, où elles sont dupliquées au premier niveau (cela ne cherchera pas de correspondances dans les propriétés imbriquées et encore une fois, il s'agit d'un écrasement et non d'une fusion):

$Json2.psobject.Properties | ForEach-Object {
    $Json1 | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value -Force
}
3
Mark Wragg 7 août 2017 à 16:26