希望这不是一个骗局,但我无法找到具体的答案。我必须使用哈希数组:
a1 = [{"aws_ebs_stripe"=>"/dev/xvdi"}, {"aws_ebs_stripe"=>"/dev/xvdj"}, {"aws_ebs_stripe"=>"/dev/xvdk"}, {"aws_ebs_stripe"=>"/dev/xvdl"}]
a2 = [{"volume_id"=>"vol-001011"}, {"volume_id"=>"vol-010110"}, {"volume_id"=>"vol-101101"}, {"volume_id"=>"vol-011001"}]
我将这些与我之前找到的一些代码结合起来
Hash[a1.zip(a2.map { |i| i.include?(',') ? (i.split /, /) : i })]
我的想法是将此输出为带有pretty_generate
的JSON,但输出中的第一个哈希值并不完全正确:
{
"{\"aws_ebs_stripe\"=>\"/dev/xvdi\"}": {
"volume_id": "vol-001011"
} .... snip
理想情况下,JSON应该如下所示
"aws_ebs_stripe: /dev/xvdi": {
"volume_id": "vol-001011"
}
我不确定清理它的最佳方法。
答案 0 :(得分:0)
看起来由于某种原因,你的哈希aws_ebs_stripe被解释为一个字符串,但正如Cary S.所提到的,你在问题中提出的哈希输出不会由你发布的代码生成。当我运行您发布的代码并在输出上使用ap(awesome_print)时,我得到了这个:
{
{ "aws_ebs_stripe" => "/dev/xvdi" } => {
"volume_id" => "vol-001011"
},
{ "aws_ebs_stripe" => "/dev/xvdj" } => {
"volume_id" => "vol-010110"
},
{ "aws_ebs_stripe" => "/dev/xvdk" } => {
"volume_id" => "vol-101101"
},
{ "aws_ebs_stripe" => "/dev/xvdl" } => {
"volume_id" => "vol-011001"
}
}
但是JSON总是会根据你创建它的方式进行转义。看看在你创建的哈希上调用.keys时会发生什么:
:051 > ap h.keys
[
[0] {
"aws_ebs_stripe" => "/dev/xvdi"
},
[1] {
"aws_ebs_stripe" => "/dev/xvdj"
},
[2] {
"aws_ebs_stripe" => "/dev/xvdk"
},
[3] {
"aws_ebs_stripe" => "/dev/xvdl"
}
]
和h.values:
:052 > ap h.values
[
[0] {
"volume_id" => "vol-001011"
},
[1] {
"volume_id" => "vol-010110"
},
[2] {
"volume_id" => "vol-101101"
},
[3] {
"volume_id" => "vol-011001"
}
]
您似乎需要正确地获取数据结构,以便以更有用的方式转换为json。
答案 1 :(得分:0)
如果您知道a1
数组将始终只包含单键哈希值,则这是一种方法。
require 'json'
Hash[a1.map{ |el| "#{el.keys.first}: #{el.values.first}" }.zip(a2)].to_json
# => "{\"aws_ebs_stripe: /dev/xvdi\":{\"volume_id\":\"vol-001011 \"}, ...
对于在a1
内的哈希中处理多个键值对的更通用的方法,就像这样。
Hash[a1.map{ |el| el.map { |k,v| "#{k}: #{v}" } }.flatten.zip(a2)].to_json
正如其他地方所述,如果可能,您可能希望改进数据结构。