2011-04-01 144 views
1

在下面的代碼,我的項目的順序獲取JSON.parse(F)行之後改變,即,該散列:JSON.parse改變排序 - 紅寶石

{ 一個=> AVAL, b => BVAL, C => CVAL, d => DVAL }

變得類似:

{ b => BVAL, C => CVAL, 一個=> AVAL, 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寶石:http://flori.github.com/json/(抱歉,有點新)。謝謝!

回答

2

在Ruby 1.8.7哈希類不或者通過鍵或通過維持秩序訂單已添加。如果你需要類似的東西,你需要實現類似ActiveSupport :: OrderedHash(http://rubydoc.info/docs/rails/ActiveSupport/OrderedHash)

在Ruby 1.9.x中,哈希按它們的順序排列(請參閱http://www.ruby-doc.org/core/classes/Hash.html

當您將散列序列化爲JSON時,所有投注都將關閉以維護您的密鑰的順序。在序列化之後,您需要進行一些後期處理,以確保在您需要的情況下進行訂購。

1

不,hashmaps並不意味着有特定的順序。如果您需要訂購,請使用陣列。或者提取所有的鍵,按照你想要的順序排列它們,然後你可以得到你喜歡的順序。

對地圖內部排序做出假設無論如何都是你不應該依賴的東西,這是事實。

一個很好的選擇。將有:

[ [a, aval], [b, bval], ... ] 
2

傑克回答爲Ruby,所以我會回答JSON。從RFC 4627(強調):

「的目標是一無序集合的零個或多個名稱/值對」

+1

我的答案與數據結構有關,一般都沒有考慮Ruby :)但歡迎您!通常,hashmaps總是無序的,無論語言是什麼 – Jack 2011-04-01 19:14:41

+0

@Jack,真的,一如往常,PHP是一個值得注意的例外。但是也可以參考標準。 – 2011-04-01 19:17:27