Rubyスクリプトで配列にハッシュ要素を追加する
概要
k8s画像のJSONを生成するRubyコードがあります
old_versions_json = "[]"
versions_list = JSON.parse(old_versions_json)
versions_list.push("#{namespace}")
c = versions_list.find { |h| h['name'] == name }
# If the service doesn't exist in the configmap yet, add it
if c.nil?
puts("[WARNING] service #{name}:#{version} is not present in the configmap. Adding it.")
versions_list.push({ "name" => name, "version" => version })
end
これが、現在 JSON 構造が登場している方法です。
[
"medusa-dev",
{
"name": "pdtk/gravity-device-data-service",
"version": "3d-dev-1.0.29"
},
{
"name": "pdtk/medusa_dooku",
"version": "3d-dev-1.1.11"
}
]
期待される出力
{
"medusa-dev": [
{
"name": "pdtk/gravity-device-data-service",
"version": "3d-dev-1.0.29"
},
{
"name": "pdtk/medusa_dooku",
"version": "3d-dev-1.1.11"
}
]
}
私はここで何を間違っているのでしょうか?
解決策
それは、versions_list が配列であるためです。これを、要素をプッシュできる配列にマップする medusa-dev のキーを持つマップにする必要があります。
old_versions_json = "{}"
versions_list = JSON.parse(old_versions_json)
versions_list[namespace] = []
c = versions_list[namespace].find { |h| h['name'] == name }
# If the service doesn't exist in the configmap yet, add it
if c.nil?
puts("[WARNING] service #{name}:#{version} is not present in the configmap. Adding it.")
versions_list[namespace].push({ "name" => name, "version" => version })
end
ところで、最初からリテラルを指定するだけで済むのに、なぜ JSON を指定してすぐに解析するのかわかりません。
versions_list = { namespace => [] }