对JSON进行Ruby迭代并写入文件

时间:2016-08-05 02:43:12

标签: ruby json

我有一个像这样的JSON文件:

data.json

{
  "ABCD": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ],
  "EFGH": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ],
  "IJKL": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ]
}

我想迭代键A1,B1,C1等,然后重写data.json文件,如下所示:

{
  "ABCD": [ ["Ax", "Bx", "Cx", "Dx"], ["Ax", "Bx", "Cx", "Dx"] ],
  "EFGH": [ ["Ex", "Fx", "Gx", "Hx"], ["Ex", "Fx", "Gx", "Hx"] ],
  "IJKL": [ ["Ix", "Jx", "Kx", "Lx"], ["Ix", "Jx", "Kx", "Lx"] ]
}

我该怎么做? 我之前从未使用过Ruby ...但我想从一些有用的脚本开始学习。

1 个答案:

答案 0 :(得分:5)

Enumerable库中有许多技巧可以帮到这里:

require 'json'

data = JSON.load <<END
{
  "ABCD": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ],
  "EFGH": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ],
  "IJKL": [ ["x", "x", "x", "x"], ["x", "x", "x", "x"] ]
}
END

reworked = Hash[
  data.map do |key, values|
    letters = key.chars

    [ key, values.map { |a| letters.zip(a).map(&:join) }]
  end
]

# => {"ABCD"=>[["Ax", "Bx", "Cx", "Dx"], ["Ax", "Bx", "Cx", "Dx"]], "EFGH"=>[["Ex", "Fx", "Gx", "Hx"], ["Ex", "Fx", "Gx", "Hx"]], "IJKL"=>[["Ix", "Jx", "Kx", "Lx"], ["Ix", "Jx", "Kx", "Lx"]]}

此处Hash[]对于将一个哈希转换为另一个哈希很有用,map用于重写列表中的每个元素。 zip将两个数组组合在一起,就像拉链一样。 chars是一种从字符串中提取单个字符的快捷方法。

如果您想将此内容写回文件:

File.open('output.json', 'w') do |f|
  f.write(JSON.dump(reworked))
end