2017-02-05 44 views
0

我試圖創建與所有微服務版本清單文件,代碼從不同的JSON文件&名到現有的one.Please看到現有的以.json模板如下:合併三個散列到一個現有的哈希值相結合

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

我想分析其他JSON文件,並結合哈希和合並在這裏應該是這樣的:

{ 
"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 
} ... 
] 
} 

刻苦攻關後,我設法分析這些以.json文件,並設法得到一個很大的散列與此代碼,名稱,版本來自所有的JSON文件,但我遇到很多問題: 1.不能反轉哈希值,因爲它是相同的鍵(代碼/名稱/版本),所以它只會返回一行,所以現在我有「價值」:「關鍵「 2.我從三個數組創建這個最終散列,所以它將創建包含所有代碼,所有名稱和最終所有版本的數組。3.我還需要將它合併到上面粘貼的模板中。 現在我的功能看起來是這樣的:

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 

所以您注意到解析以.json文件都存儲在這裏:./resources/release/release-updates/#{s}/manifest.json其中S =可以是核心的流&處理&包裝。如果您想幫助您可以在此位置創建2個或3個json文件,並嘗試合併位於當前文件夾中的模板。從那裏我需要的代碼,名稱和服務版本這2個或3個文件都是這樣:

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

輸出

{"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

請您提供正確的語法的一個小例子(沒有'...'),展示一下你的代碼輸出和現在它應該輸出什麼? –

+0

請在下面找到一個輸出示例,但抱歉,我無法複製粘貼所有內容,因爲列表比較大,但是我沒有收到任何錯誤,它解析正確,並且它帶來了文件中所有適當的值。問題出在Key價值被回覆,我正如我上面提到的,如果我申請反轉它將只返回最後的值,我想我需要有一個哈希每個代碼,名稱,服務版本。請參閱編輯問題中的輸出。 –

+0

我改變了策略並使用了result = data_hash ['services']。map do | h | { '代碼'=> H [ '代碼'], '名稱'=> H [ '名稱'], '版本'=> H [ '服務版本'] } 端...這使用正確的散列k-> v返回一個數組很好,但只能從最後一個json文件返回。 –

回答

1

所以基本上我們需要從模板創建一個哈希和另一位來自值從以.json文件

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 

從模板哈希

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

和合並

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

或保存:

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