2010-06-26 35 views
1

我一直在努力與這一整天。在我的Rails 2.3.5應用程序中,我有一堆自定義代碼,允許發生以下事件:調整哈希#to_json

>> strip_hash_keys_for_json({ "a" => 1 }).to_json 
=> "{ a: 1 }" 

所以你看到字符串鍵不會被引用。它通過創建一個String後代類來實現,該類從to_json返回self,並且所有的散列鍵都被封裝在這個類中。

今天我已經開始將應用程序升級到Rails 3,並且它已停止工作,因爲JSON編碼的內容已被相當嚴重地重寫。

正如您可能知道,在Rails 3中產生的哈希值的JSON表示包括兩種方法:

  • as_json這決定了哈希的元素應該存在於JSON
  • encode_json這實際上回報一個包含JSON的字符串表示形式

我想通過觀察encode_json做什麼來改變事情發生的方式,並且調整了一些獲取c的方法從那裏出發。

問題是這兩個方法根本不會被調用。我檢查了我在調查中可能犯的每一個愚蠢的錯誤,並且我沒有看到任何錯誤。谷歌也沒有幫助,所以我轉向SO研究員尋求幫助。

非常感謝。

UPDATE

行,所以我想通了,爲了讓這些方法來工作,我必須使用ActiveSupport::JSON::encode,而不是直接to_json。這看起來很奇怪,因爲 我認爲{}.to_json是由在encoding.rb文件中定義的Object#to_json方法處理的,該文件又調用ActiveSupport::JSON.encode(self, options)

現在我完全困惑。

回答

0

當您移除strip_hash_keys_for_json時會發生什麼?

我打開了一個控制檯,並得到:

ruby-1.8.7-p249 > Rails::VERSION::STRING 
=> "2.3.5" 
ruby-1.8.7-p249 > { "a" => 1 }.to_json 
=> "{\"a\":1}" 
+0

你得到了什麼是to_json'的'標準的行爲。但是,我期望的行爲是不引用字符串鍵。我有不清楚的問題嗎? – 2010-06-27 08:36:12

+0

我明白了。我將代碼示例看作是不需要的行爲。 – 2010-06-27 09:17:28

+0

有效的JSON需要引用字符串鍵。 – 2011-04-29 00:19:13