JSON.parse更改排序 - Ruby

时间:2011-04-01 17:54:20

标签: ruby json parsing sorting

在下面的代码中,我的项目的顺序在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/(对不起,有点新手)。谢谢!

3 个答案:

答案 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时,所有的赌注都会被关闭以维持你的密钥顺序。在序列化之后,您需要进行一些后期处理,以确保在需要时进行订购。