当我在ruby hash中重命名密钥的名称时,如何保持密钥的位置?

时间:2014-08-11 23:09:36

标签: ruby xml hash

我想将json转换为xml。 起初,我将json转换为hash,因为我想更改某些键的名称。我使用映射进行更改。

@issue_xml = "tmp.xml"

issues = File.new(@issue_xml, File::WRONLY|File::TRUNC|File::CREAT)

issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

issues.puts "<errorList xmlns=\"http://www.klocwork.com/inForce/report/1.0\" version=\"9.5.2\">"
mappings = {"id" => "problemID","severityCode" => "severitylevel","status" => "citingStatus"}

my_hash = JSON.parse(line)    
my_hash.keys.each { |k| my_hash[ mappings[k] ] = my_hash.delete(k) if mappings[k] }


my_xml = my_hash.to_xml(:root => 'problem')

my_xml.each_line do |line|        
    next if line.start_with?("<?xml") or line.eql?("<hash>") or line.eql?("</hash>")
    issues.puts line        
end 
issues.puts "</errorList>"

issues.close  

使用上面的代码,我可以生成一个xml文件。 但结果与我的期望略有不同。

这是我的问题。

我希望关键'problemID'出现在每个问题的开头。但新映射的密钥'problemID,severityCode,citingStatus'被移动到最后。

你能让我知道如何保持钥匙的位置吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

此:

issues = File.new(@issue_xml, File::WRONLY|File::TRUNC|File::CREAT)

相当于:

issues = File.new(@issue_xml, 'w')

...所以,除非你喜欢将所有这些常数输入OR',否则请使用较短的版本。

接下来,很可能在你的一生中,你永远不需要在ruby中逃避引用。这样:

issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"

相当于:

issues.puts %Q{<?xml version="1.0" encoding="UTF-8" ?>}

在这种情况下,你可以写:

issues.puts '<?xml version="1.0" encoding="UTF-8" ?>'

行变量在哪里:

my_hash = JSON.parse(line)  

哈希没有to_xml()方法:

my_xml = my_hash.to_xml(:root => 'problem')

我不确定为什么你发布了所有未运行的代码...因为你的问题与该代码无关。试试这个:

data = {
  'a' => 1,
  'b' => 2,
  'c' => 3,
}

key_map = {
  'b' => 'y',
  'a' => 'x',
}

results = {}

data.keys.each do |key|
  new_key = key_map[key] || key
  results[new_key] = data[key]
end

p results

--output:--
{"x"=>1, "y"=>2, "c"=>3}

答案 1 :(得分:0)

这段代码似乎是按照未映射的JSON的顺序放置的,而不是&#39;映射的顺序。散列。

你可以试试这样的东西吗?

mappings = {"id" => "problemID","severityCode" => "severitylevel","status" => "citingStatus"}

hash = JSON.parse(line)    
my_hash = {}
mappings.keys.each { |k| my_hash[ mappings[k] ] = hash.delete(k) if hash[k] }
my_hash.merge! hash

答案 2 :(得分:0)

我不确定我是否理解这个问题。如果以下内容满足您的要求,请告知我们。如果没有,请根据需要更改我的示例,并为my_hash提供所需的结果。

<强>代码

my_hash = JSON.parse(line)
mappings.each { |k,_| my_hash[mappings[k] = my_hash.delete(k) }

示例

mappings = { "id"=>"problemID", "severityCode"=>"severitylevel",
             "status"=>"citingStatus" }
my_hash = { "cat"=>0, "id"=>1, "status"=>2, "severityCode"=>3,
            "problemID"=>4, "dog"=>5, "citingStatus"=>6, "severitylevel"=>7 }
mappings.each { |k,_| my_hash[mappings[k]] = my_hash.delete(k) }
my_hash
  #=> { "cat"=>0, "problemID"=>1, "dog"=>5,
  #     "citingStatus"=>2, "severitylevel"=>3 }