我正在为其中一个内联应用构建配置文件。它本质上是一个json文件。我每次都以同样的方式输出puppet / jyson,我遇到了很多麻烦。
我正在使用
<%= require "json"; JSON.pretty_generate data %>
但是在输出人类可读内容时,每次都不能保证相同的顺序。这意味着木偶会经常针对相同的数据发送更改通知。
我也试过
<%= require "json"; JSON.pretty_generate Hash[*data.sort.flatten] %>
每次都会生成相同的数据/顺序。当数据有嵌套数组时会出现问题。
data => { beanstalkd => [ "server1", ] }
变为
"beanstalkd": "server1",
而不是
"beanstalkd": ["server1"],
我现在已经开始和关闭这几天了,所以想要一些帮助
答案 0 :(得分:3)
由于Ruby 中的哈希是有序的,并且问题用ruby标记,这里的方法是递归排序哈希(不影响数组的排序):< / p>
def sort_hash(h)
{}.tap do |h2|
h.sort.each do |k,v|
h2[k] = v.is_a?(Hash) ? sort_hash(v) : v
end
end
end
h = {a:9, d:[3,1,2], c:{b:17, a:42}, b:2 }
p sort_hash(h)
#=> {:a=>9, :b=>2, :c=>{:a=>42, :b=>17}, :d=>[3, 1, 2]}
require 'json'
puts sort_hash(h).to_json
#=> {"a":9,"b":2,"c":{"a":42,"b":17},"d":[3,1,2]}
请注意,如果您的哈希值具有无法比较的密钥,则会发生灾难性故障。 (如果您的数据来自JSON,则不会出现这种情况,因为所有键都是字符串。)
答案 1 :(得分:0)
哈希是一种无序数据结构。在某些语言(例如ruby)中,有一个有序的哈希版本,但在大多数情况下,在大多数语言中,你不应该依赖哈希中的任何特定顺序。
如果订单对您很重要,您应该使用数组。那么,你的哈希
{a: 1, b: 2}
变成这个
[{a: 1}, {b: 2}]
我认为,它不会对您的代码强制进行太多更改。
试试这个:
data = {beanstalkId: ['server1'], ccc: 2, aaa: 3}
data2 = data.keys.sort.map {|k| [k, data[k]]}
puts Hash[data2]
#=> {:aaa=>3, :beanstalkId=>["server1"], :ccc=>2}