在下面的代码中,我的项目的顺序在JSON.parse(f)行之后发生了变化,即这个哈希:
{ a =>票据背书担保, b => BVAL, c => CVAL, d => DVAL }
变得像:
{ b => BVAL, c => CVAL, a =>票据背书担保, d => DVAL }
这是一个问题,因为我的显示代码只是从json文件读取,因此每当我保存回来,然后显示,一切都会改变。我有什么办法可以保留订单吗?
CODE:
f = File.read($PLAN_DESC_PATH)
puts ("f " + f.to_s())
hash = JSON.parse(f)
puts ("hash " + hash.to_s())
我的Ruby版本是1.8.7。我正在使用Sinatra。我相信我从这里得到了JSON gem:http://flori.github.com/json/(对不起,有点新手)。谢谢!
答案 0 :(得分:2)
不, hashmaps 并不意味着具有特定的排序。如果您需要订购,请使用与数组不同的东西。或者提取所有的密钥,按照你想要的方式对它们进行排序,然后你可以得到你喜欢的顺序。
对地图中的排序做出假设无论如何都是你不应该依赖的东西,这就是事实。
一个好的选择是:
[ [a, aval], [b, bval], ... ]
答案 1 :(得分:2)
杰克回答了Ruby,所以我会回答JSON。来自RFC 4627(强调补充):
“对象是零个或多个名称/值对的无序集合”
答案 2 :(得分:2)
在Ruby 1.8.7中,Hash类不按键或按顺序维护顺序。如果你需要类似的东西,你需要实现类似ActiveSupport :: OrderedHash(http://rubydoc.info/docs/rails/ActiveSupport/OrderedHash)
在Ruby中1.9.x哈希值在默认情况下插入时排序(参见http://www.ruby-doc.org/core/classes/Hash.html)
当你将哈希序列化为JSON时,所有的赌注都会被关闭以维持你的密钥顺序。在序列化之后,您需要进行一些后期处理,以确保在需要时进行订购。