【发布时间】:2017-02-05 12:55:26
【问题描述】:
我正在尝试创建一个包含所有微服务版本、代码和名称的清单文件,从不同的 json 文件到现有的文件中。请参阅下面的现有 .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.不能反转哈希值,因为它是相同的键(代码/名称/版本)所以它只会返回一行,所以现在我有 "value": "key" 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=stream 可以是 core&processing&packaging。如果您想提供帮助,您可以在此位置创建 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"}
【问题讨论】:
-
您能否提供一个语法正确的小例子(没有
...),显示您的代码现在输出什么以及应该输出什么? -
请在下面找到一个示例输出,但抱歉我无法复制粘贴所有内容,因为列表更大但我没有收到任何错误,它解析正确,它带来了所有正确的值文件。问题在于已还原的键值,如上所述,如果我应用反转,它将仅返回最后一个值,我认为我需要为每个代码、名称、服务版本设置一个哈希值。请查看已编辑问题中的输出。
-
我改变了策略并使用了 result = data_hash['services'].map do |h| { 'code' => h['code'], 'name' => h['name'], 'version' => h['service-version'] } end ... 它很好地返回一个数组正确的哈希 k->v 但仅来自最后一个 json 文件。
标签: ruby