如何将平面散列转换为条件键后的嵌套?

How to convert flat hash into nested after conditional key?

我正在尝试将 xml 转换为 json 结构。我得到了所有行,首先将其提取为 header 并将其与接下来的所有行一起压缩,但是我必须在 word 属性之后嵌套键,该怎么做?

当前步骤:

变量:

header = ["id",
 "groupName",
 "words",
 "Unit",
 "Name",
 "Image"]

rows = [["1",
  "gr 1",
  nil,
  "1",
  "Test",
  "test.png"],
 ["1",
  "gr 1",
  nil,
  "23",
  "Taefawe",
  "adf.png"]]

当前输出=>

[{"id"=>"1",
  "groupName"=>"Unit 1",
  "words"=>nil,
  "Unit"=>"1",
  "Name"=>"Test",
  "Image"=>"test.png"},
 {"id"=>"1",
  "groupName"=>"gr 1",
  "words"=>nil,
  "Unit"=>"23",
  "Name"=>"Taefawe",
  "Image"=>"adf.png"}]

期望:

[{"id"=>"1",
  "groupName"=>"Unit 1",
  "words"=>{
    "Unit"=>"1",
    "Name"=>"Test",
    "Image"=>"test.png"
  }
 },
 {"id"=>"1",
  "groupName"=>"gr 1",
  "words"=> {
    "Unit"=>"23",
    "Name"=>"Taefawe",
    "Image"=>"adf.png"
  }}]

当前代码:

rows = doc.sheets.first.rows
header = rows.shift

out = []
rows.each do |row|
  out << Hash[header.zip(row.map{|val| val})]
end

如果您的 headers 始终不变,我认为最好的方法是:

rows.inject([]) do |res, row|
  res << {"id" => row[0],
          "groupName" => row[1],
          "words" => {
                        "Unit" => row[3],
                        "Name"  => row[4],
                        "Image" => row[5]} 
         }
end

或者您也可以将 hash 中的 key 常量替换为 header[index]

如果你把它恢复为真 xml 你应该可以使用:

Hash.from_xml(doc.sheets)