2010-06-26 34 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