2015-05-20 12 views
8

ho JSON che assomiglia a questo:Unione di oggetti JSON in PowerShell

{ 
    "Workflow": [ 
     { 
      "Parameters": { 
       "Project": "/Path/To/File", 
       "OtherParam": "True" 
      } 
     } 
    ], 
    "Overrides": [ 
     { 
      "Special": { 
       "Parameters": { 
        "NewParam": "NewStuffGoesHere", 
        "OtherParam": "False" 
       } 
      } 
     } 
    ] 
} 

... dove voglio utilizzare la sezione Overrides.Special per aggiungere o aggiornare i campi nell'oggetto flusso di lavoro. In altre parole, dato il JSON sopra, voglio fare qualcosa di simile:

$config = Get-Content workflow.json | out-string | ConvertFrom-Json 
$configWithOverrides = Merge-Object $config.Workflow $config.Overrides.Special 

e finire con qualcosa di simile:

$configWithOverrides 

Parameters 
---------- 
@{Project=/Path/To/File; NewParam=NewStuffGoesHere; OtherParam=False} 

posso certamente scrivere la funzione Merge-Object sopra per aggiungere o aggiorna i valori secondo necessità in base a cosa c'è nella sezione di sovrascrittura, ma sembra che ci dovrebbe (potrebbe?) essere un modo integrato o one-liner per gestirli.

ho provato questo:

$test = $config.Workflow + $config.Overrides.Special 

... ma che non funziona del tutto.

$test 
Parameters 
---------- 
@{Project=/Path/To/File; OtherParam=True} 
@{NewParam=NewStuffGoesHere; OtherParam=False} 

In questo modo i parametri che aggiungono:

>$test.Parameters.NewParam 
NewStuffGoesHere 

... ma non è così grande per l'aggiornamento loro

>$test.Parameters.OtherParam 
True 
False 

Nota - In questo esempio, ho scelto di gestire il Unisci dopo aver convertito il json in un psobject, ma non è un requisito.

+0

Possibile: http://stackoverflow.com/questions/29670111/powershell-merging-json-files – Matt

+0

Questa soluzione non funziona (in realtà non è convinto che funzioni anche per il problema descritto in questo caso). Ho aggiunto ulteriori informazioni sopra per chiarire perché un "+" dritto dei nodi è inadeguato. – Alan

+0

L'ultima volta proverò: http: // StackOverflow.it/questions/29330627/extend-json-with-another-in-powershell/29334164 # 29334164 forse è più quello a cui ti stavi appoggiando. Sebbene sia una risposta basata sulla funzione che hai affermato di essere in grado di fare – Matt

risposta

6

Ho una sola linea per fare quello che stai chiedendo. Si noti che, per quanto ne so, PowerShell non gestisce direttamente con stringhe json. Ma, una volta convertito in oggetti PowerShell, è come qualsiasi altro oggetto.

Quindi, in primo luogo, definire il file JSON, e leggerlo come una singola stringa:

# Requires -Version 4 
$jsonFile='c:\temp\jsonfile.json' 
[email protected](gc $jsonFile -raw)|ConvertFrom-Json 

definire la proprietà su cui si desidera unire gli oggetti del JSON, e il 1 ° e 2 oggetti:

$property='Parameters' 
$1=$jsonObj.Workflow.$property 
$2=$jsonObj.Overrides.Special.$property 

Ora, vedere l'one-liner (che ho diviso in 3, per motivi di chiarezza):

$MergedJson=[pscustomobject]@{ 
    $property=$2.psobject.properties|%{$11=$1}{$11|add-member $_.name $_.value -ea Ignore}{$11} 
}|ConvertTo-Json 

Vedi? $MergedJson detiene la seguente stringa (utilizzando la stringa JSON):

{ 
    "Parameters": { 
         "Project": "/Path/To/File", 
         "OtherParam": "True", 
         "NewParam": "NewStuffGoesHere" 
        } 
} 

è quello che stai cercando?

P.S .: se si scambiano i ruoli di $ 1 e $ 2, i valori comuni (come OtherParam) prevalgono, cambiano.

+0

Contrassegnato come risposta - Ho scritto una versione più lunga nel frattempo, ma a breve mi rifatterò su questa soluzione. Grazie – Alan

Problemi correlati