在ruby哈希中重命名密钥名称时,如何保持密钥的位置?
我想把json转换成xml。 首先,我将json转换为哈希,因为我想更改一些键的名称。我使用映射进行更改在ruby哈希中重命名密钥名称时,如何保持密钥的位置?,ruby,xml,hash,Ruby,Xml,Hash,我想把json转换成xml。 首先,我将json转换为哈希,因为我想更改一些键的名称。我使用映射进行更改 @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:
@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
@issue\u xml=“tmp.xml”
issues=File.new(@issue_xml,File::WRONLY | File::TRUNC | File::CREAT)
发行。卖出“”
发行。卖出“”
映射={“id”=>“problemID”、“severityCode”=>“severitylevel”、“status”=>“citingStatus”}
my_hash=JSON.parse(第行)
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|
下一个if line.start_with?(“这段代码似乎是按照未映射JSON的顺序,而不是按照“mappings”散列的顺序
你可以试试这样的吗
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
我不确定我是否理解这个问题。请让我知道以下内容是否满足您的要求。如果不满足,请根据需要更改我的示例,并为my\u 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 }
示例
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 }
这:
相当于:
issues = File.new(@issue_xml, 'w')
issues.puts %Q{<?xml version="1.0" encoding="UTF-8" ?>}
…因此,除非您喜欢键入所有这些常量或将它们合并在一起,否则请使用较短的版本
接下来,在您的有生之年,您很可能永远不需要在ruby中转述一句话。这是:
issues.puts "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
哈希没有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}
我试过了。结果显示,所有映射键都被移动到xml的开头@A Fader darkli使用您的建议解决了它。我安装了active_支持以使用“to_xml”。因此,我的脚本正在运行。非常感谢@7stud
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}