2016-07-27 19 views
0

Ich habe zwei JSONS:Verschmelzung von 2 JSON zu einem einzigen JSON mit Wertanalyse in bash.

{ 
    "name": "paypal_modmon", 
    "description": "Role For Paypal admin-service box", 
    "run_list": [ 
     "recipe[djcm_paypal_win::sslVerify]" 
    ] 
    } 

und

{ 
    "name": "paypal_dev", 
    "default_attributes": { 
    "7-zip": { 
     "home": "%SYSTEMDRIVE%\\7-zip" 
    }, 
    "modmon": { 
     "env": "dev" 
    }, 
    "paypal": { 
     "artifact": "%5BINTEGRATION%5D" 
    } 
    }, 
    "override_attributes": { 
    "default": { 
     "env": "developmen" 
    }, 
    "windows": { 
     "password": "Pib1StheK1N5" 
    }, 
    "task_sched":{ 
     "credentials": "kX?rLQ4XN$q" 
    }, 
    "seven_zip": { 
     "url": "https://djcm:[email protected]/artifactory/djcm-zip-local/djcm/chef/paypal/7z1514-x64.msi" 
    } 
    }, 
    "chef_type": "environment" 
} 

Ich mag die Werte aus der zweiten json lesen: „default_attributes“ und „override_attributes“ und sie mit dem ersten json in einen Ausgang fusionieren wie:

{ 
    "description": "Role For Paypal admin-service box", 
    "run_list": [ 
    "recipe[djcm_paypal_win::sslVerify]" 
    ], 
    "chef_type": "environment", 
    "seven_zip": { 
     "url": "https://djcm:[email protected]/artifactory/djcm-zip-local/djcm/chef/paypal/7z1514-x64.msi" 
    }, 
    "task_sched": { 
     "credentials": "kX?rLQ4XN$q" 
    }, 
    "windows": { 
     "password": "Pib1StheK1N5" 
    }, 
    "paypal": { 
     "artifact": "%5BINTEGRATION%5D" 
    }, 
    "modmon": { 
     "env": "dev" 
    }, 
    "7-zip": { 
     "home": "%SYSTEMDRIVE%\\7-zip" 
    }, 
    "default": { 
     "env": "developmen" 
    }, 
    "name": "paypal_modmon" 
} 

Gibt es eine Möglichkeit, dies in bash zu tun und wie würde es gehen, um es zu erreichen?

Antwort

0

Verstanden. Mit jq scheint super einfach:

jq -s '.[0] + .[1].default_attributes + .[1].override_attributes' a-roles.json a-env.json > manifest.json 

manifest.json ->

{ 
    "default": { 
    "env": "developmen-jq" 
    }, 
    "7-zip": { 
    "home": "%SYSTEMDRIVE%\\7-zip" 
    }, 
    "name": "paypal_modmon", 
    "description": "Role For Paypal admin-service box", 
    "run_list": [ 
    "recipe[djcm_paypal_win::sslVerify]" 
    ], 
    "seven_zip": { 
    "url": "https://djcm:[email protected]/artifactory/djcm-zip-local/djcm/chef/paypal/7z1514-x64.msi" 
    }, 
    "task_sched": { 
    "credentials": "kX?rLQ4XN$q" 
    }, 
    "windows": { 
    "password": "Pib1StheK1N5" 
    }, 
    "paypal": { 
    "artifact": "%5BINTEGRATION%5D" 
    }, 
    "modmon": { 
    "env": "dev" 
    } 
} 

EDIT 1:

Ich muss auch den run_list Schlüsselwertpaar parsen von a-roles.json und Ignoriere alle anderen Informationen, um etwas zu haben:

{ 
    "default": { 
    "env": "developmen-jq" 
    }, 
    "7-zip": { 
    "home": "%SYSTEMDRIVE%\\7-zip" 
    }, 
    "run_list": [ 
    "recipe[djcm_paypal_win::sslVerify]" 
    ], 
    "seven_zip": { 
    "url": "https://djcm:[email protected]/artifactory/djcm-zip-local/djcm/chef/paypal/7z1514-x64.msi" 
    }, 
    "task_sched": { 
    "credentials": "kX?rLQ4XN$q" 
    }, 
    "windows": { 
    "password": "Pib1StheK1N5" 
    }, 
    "paypal": { 
    "artifact": "%5BINTEGRATION%5D" 
    }, 
    "modmon": { 
    "env": "dev" 
    } 
} 

ist das möglich mit jq?

0

Wenn Sie mehrere Dateien einlesen, sollten Sie im Allgemeinen die Option --argfile verwenden, damit Sie den Inhalt der Datei nach Namen referenzieren können. Nach dem Namen der Attribute zu urteilen, die Sie zusammenführen möchten, sollten Sie sich vor den verschiedenen Zusammenführungsoptionen, die Sie haben, in Acht nehmen. default_attributes schlägt vor, dass es Attribute sein sollte, die verwendet werden sollten, wenn sie weggelassen werden. override_attributes schlägt vor, es sollte in seinen Werten zu erzwingen.

$ jq --argfile merge input2.json \ 
'($merge.default_attributes * .) + $merge.override_attributes' input1.json 

Durch die Eingabe mit dem default_attributes verschmelzenden * verwenden, ermöglicht es Ihnen, mit den Standardeinstellungen gestartet und Ihre tatsächlichen Werte an Ort und Stelle hinzuzufügen. Auf diese Weise werden fehlende Werte vom Standardobjekt bereitgestellt.

dann das override_attributes Objekt werden die Werte vollständig ersetzt und nicht fusionierte gerade.

+0

dank @ Jeff, überprüfen Sie bitte meine bearbeiten 1 – Scooby