2017-02-05 5 views
0

Ich versuche, eine Manifest-Datei mit allen Versionen Microservices zu erstellen, Code & Namen aus verschiedenen json-Dateien in eine vorhandene one.please unterhalb der bestehenden .json Vorlage siehe:Merge drei Hashes in eine bestehende Hash-Werte kombiniert

{ 
    "name": "MS Suite", 
    "version": "2017.1.0" 
} 

und ich mag andere json-Dateien analysieren und die Hashes kombinieren und hier verschmelzen, die aussehen soll:

{ 
"name": "MS Suite", 
"version": "2017.1.0", 
"components": [ 
{ 
    "code": "1x.2017", 
    "name": "microservice1", 
    "version": "1.1.3-1" 
}, 
{ 
    "code": "3x.2017", 
    "name": "microservice2", 
    "version": "1.1.15-1" 
}, 
{ 
    "code": "2x.2017", 
    "name": "microservice3", 
    "version": "1.1.17-1 
} ... 
] 
} 

nach harter Forschung ich diese .json Dateien analysieren zu verwalten und verwalten einen großen Hash zu bekommen dieser Code, Name, Version von alle JSON-Dateien, aber ich stoße auf viele Probleme: 1.Kann die Hash-Werte nicht invertieren, da es der gleiche Schlüssel (Code/Name/Version) ist, so dass es nur eine Zeile zurückgibt, also habe ich jetzt "value": " Schlüssel " 2.Ich erstelle diesen letzten Hash von drei Arrays, so dass er das Array mit allen Codes, allen Namen und schließlich allen Versionen erstellt 3.Und ich muss dies auch in die oben eingefügte Vorlage zusammenführen. Im Moment sieht meine Funktion dies wie:

code=[] 
name=[] 
version=[] 
stream.each do |s| 
file = File.read("./resources/release/release-updates/#{s}/manifest.json") 
data_hash = JSON.parse(file) 
data_hash['services'].each do |h| 
    code << h['code'] 
    name << h['name'] 
    version << h['service-version'] 
    c = Hash[code.map {|v| [v, 'code']}] 
    n = Hash[name.map {|v| [v, 'name']}] 
    v = Hash[version.map {|v| [v, 'version']}] 
    a = [c, n, v] 
    @result = a.inject(&:merge)#Hash[*a.map(&:to_a).flatten] 
end 
end 
puts @result.to_json 

So bemerken Sie, dass die .json Dateien für das Parsen hier gespeichert: ./resources/release/release-updates/#{s}/manifest.json wo s = Strom, der Kern sein kann & Verarbeitung & Verpackung. Wenn Sie helfen möchten, können Sie zwei oder drei JSON-Dateien an diesem Speicherort erstellen und versuchen, die Vorlage in dem aktuellen Ordner zusammenzuführen. Diese 2 oder 3 Dateien aus, wo ich Code zu nehmen, Namen und Service-Version sind wie folgt aus:

... 
"services": [{ 
    "name": "1 Micro service", 
    "service-name": "microservice1", 
    "code": "1x", 
    "service-version": "3.1.3-1", 
    "cookbook-name": "microservice1", 
    "cookbook-version": "0.2.63", 
    "cookbook-repo": "ssh://git..." 
}, { 
    "name": "2 Micro service", 
    "service-name": "microservice2", 
    "code": "1x", 
    "service-version": "3.1.6-1", 
    "cookbook-name": "microservice2", 
    "cookbook-version": "0.1.73", 
    "cookbook-repo": "ssh://git...." 
}... 

OUTPUT

{"1x":"code","2x":"code","3x":"code","4x":"code","5x":"code","6x":"code","microservice1":"name","microservice2":"name","microservice3":"name","microservice4":"name","microservice5":"name","microservice6":"name","3.1.3-1":"version","3.1.6-1":"version","3.1.9-1":"version","2017.1.0.0-17_1":"version","2017.1.0.47-RELEASE":"version","1.8.3-1":"version"} 
+1

Könnten Sie bitte ein kleines Beispiel mit dem richtigen Syntax zur Verfügung stellen (keine '...'), zeigen, was jetzt Ihr Code Ausgänge und Was sollte es ausgeben? –

+0

Unten finden Sie eine Beispielausgabe, aber leider kann ich nicht alles kopieren, weil die Liste viel größer ist, aber ich bekomme keinen Fehler, es analysiert richtig und es bringt alle richtigen Werte aus Dateien.Das Problem ist bei Key Wert, der zurückgesetzt wird und ich, wie ich oben erwähnt habe, wenn ich invertiere, gebe nur die letzten Werte zurück und ich denke, dass ich einen Hash für jeden Code, Namen, Service-Version haben muss. Bitte beachten Sie die Ausgabe in der Frage bearbeitet. –

+0

Ich änderte die Strategie und verwendete result = data_hash ['services']. Map do | h | { 'Code' => h [ 'Code'], 'name' => h [ 'name'], 'Version' => h [ 'service-Version'] } Ende ... Es funktioniert großartig, ein Array mit dem richtigen Hash k-> v aber nur aus der letzten JSON-Datei zurückgeben. –

Antwort

1

Also im Grunde brauchen wir einen Hash aus der Vorlage erstellen und eine andere von den Werten aus den .json Dateien

components = [] 
stream.each do |s| 
file = File.read("path.../#{s}/manifest.json") 
data_hash = JSON.parse(file) 
components << data_hash['services'].map do |h| 
    { 
    'code' => h['code'], 
    'name' => h['name'], 
    'version' => h['service-version'] 
    } 
end 
end 

der Hash aus der Vorlage

mainfestfile = File.read("path...") 
header = JSON.parse(mainfestfile) 

und die Zusammenführung

concatenated = components.flatten 
header['components'] = concatenated 
puts header.to_json 

oder speichern:

File.open("./path.json","w") do |f| 
    f.puts JSON.pretty_generate(header) 
end 
Verwandte Themen