Ordene las teclas de los objetos que está serializando antes de darles salida. En Ruby 1.9 hashes están ordenados por defecto; en Ruby 1.8 no lo son. Puedes usar OrderedHash desde active_support para estar seguro en cualquier caso.
Cuando vaya a escribir sus datos JSON, ordene las claves. Tenga en cuenta que en Ruby 1.8, los símbolos no se pueden ordenar, por lo que debe llamar al to_s
en su ordenación.
require 'rubygems'
require 'json'
require 'active_support/ordered_hash'
obj = {
:fig => false,
:bananas => false,
:apples => true,
:eggplant => true,
:cantaloupe => true,
:dragonfruit => false
}
def sorted_hash(hsh)
sorted_keys = hsh.keys.sort_by { |k| k.to_s }
sorted_keys.inject(ActiveSupport::OrderedHash.new) do |o_hsh, k|
o_hsh[k] = hsh[k]
o_hsh
end
end
puts JSON.pretty_generate(obj)
# Could output in any order, depending on version of Ruby
# {
# "eggplant": true,
# "cantaloupe": true,
# "dragonfruit": false,
# "fig": false,
# "bananas": false,
# "apples": true
# }
puts JSON.pretty_generate(sorted_hash(obj))
# Always output in the same order
# {
# "apples": true,
# "bananas": false,
# "cantaloupe": true,
# "dragonfruit": false,
# "eggplant": true,
# "fig": false
# }
Si los datos se compone de una matriz de objetos u objetos anidados, necesitará crear hashes ordenados de forma recursiva:
nested_obj = {:a => {:d => true, :b => false}, :e => {:k => false, :f => true}, :c => {:z => false, :o => true}}
def recursive_sorted_hash(hsh)
sorted_keys = hsh.keys.sort_by { |k| k.to_s }
sorted_keys.inject(ActiveSupport::OrderedHash.new) do |o_hsh, k|
o_hsh[k] = hsh[k].is_a?(Hash) ? recursive_sorted_hash(hsh[k]) : hsh[k]
o_hsh
end
end
puts JSON.pretty_generate(nested_obj)
# Again, could be in any order
# {
# "a": {
# "b": false,
# "d": true
# },
# "e": {
# "f": true,
# "k": false
# },
# "c": {
# "z": false,
# "o": true
# }
# }
puts JSON.pretty_generate(recursive_sorted_hash(nested_obj))
# Even nested hashes are in alphabetical order
# {
# "a": {
# "b": false,
# "d": true
# },
# "c": {
# "o": true,
# "z": false
# },
# "e": {
# "f": true,
# "k": false
# }
# }
Gracias. Eso hará el trabajo bien. –
Nota: esto funciona porque 'sort_keys = True' en la implementación de' json.tool', pero esta garantía no parece estar documentada en ninguna parte, por lo que puede valer la pena escribir su propia secuencia de comandos que pueda garantizar: 'import json, sys; imprimir json.dumps (json.load (sys.stdin), sort_keys = True) ' –