【问题标题】:Tweaking Hash#to_json调整哈希#to_json
【发布时间】:2011-03-08 16:38:46
【问题描述】:

我一整天都在为此苦苦挣扎。在我的 Rails 2.3.5 应用程序中,我有一堆自定义代码允许发生以下情况:

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

所以你看到字符串键没有被引用。它是通过创建一个从to_json返回selfString后代类来实现的,并且所有的哈希键都包装在这个类中。

今天我已经开始将应用程序升级到 Rails 3,它已经停止工作,因为 JSON 编码的东西已经被非常认真地重写了。

您可能知道,在 Rails 3 中创建哈希的 JSON 表示涉及两种方法:

  • as_json 决定 JSON 中应该存在哪些哈希元素
  • encode_json 实际上返回一个包含 JSON 的字符串表示

我认为我可以通过观察 encode_json 所做的事情并调整一些从那里调用的方法来改变事情发生的方式。

问题是这两个方法根本没有被调用。我检查了我在调查中可能犯的每一个愚蠢的错误,我看不出有什么问题。 Google 也无济于事,所以我求助于 SO Fellows。

非常感谢。

更新

好的,所以我发现为了使这些方法起作用,我必须直接使用ActiveSupport::JSON::encode 而不是to_json。这看起来很奇怪,因为 我认为{}.to_json 是由同一个encoding.rb 文件中定义的Object#to_json 方法处理的,该文件又调用ActiveSupport::JSON.encode(self, options)

现在我完全糊涂了。

【问题讨论】:

    标签: ruby-on-rails ruby json hash


    【解决方案1】:

    删除 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}" 
    

    【讨论】:

    • 你得到的是to_json的标准行为。但是,我想要的行为是它不引用字符串键。我是不是说的不清楚?
    • 有效的 JSON 需要引用字符串键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2013-12-21
    • 2012-10-14
    • 2021-03-14
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多