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"}
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? –
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. –
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. –