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

coc*_*ave -1 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"] ]
}
Run Code Online (Sandbox Code Playgroud)

我想遍历键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"] ]
}
Run Code Online (Sandbox Code Playgroud)

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

tad*_*man 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"]]}
Run Code Online (Sandbox Code Playgroud)

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

如果要将其写回文件:

File.open('output.json', 'w') do |f|
  f.write(JSON.dump(reworked))
end
Run Code Online (Sandbox Code Playgroud)